有几次我因为建议使用以下方法而受到批评:
在Swing组件上.当我想在显示的组件之间定义比例时,我没有看到任何替代它们的用法.我被告知这个:
对于布局,答案总是相同的:使用合适的LayoutManager
我在网上搜索了一下,但我没有找到任何关于这个主题的综合分析.所以我有以下问题:
列出您最喜欢的堆分析工具(例如jprofiler,jmap,...).让我们为每个答案保留一个工具,并列出每个工具的优缺点.
我们想用Java快速构建小部件原型.我们将它们叠加在用专有第三方图形包编写的显示器上.我们发现Java GUI会从窗口管理器中窃取键盘焦点.
窗口管理器是fvwm,我已经尝试配置它以便Java应用程序设置为不获得焦点,而且如果它确实得到焦点将它拿走并将其提供给其他GUI.
如果我使用Java应用程序运行它它不起作用(只要鼠标在Java GUI上它有键盘焦点) - 如果我交换一些标准的X GUI小部件(XEyes)代替Java GUI它就像一个魅力.这为Java不尊重ICCCM的声明(由fvwm的人员维护)提供了一些可靠性.
我想知道其他人是否已经解决了这个问题,如果是这样的话.到目前为止,我有一些选择如何尝试解决这个问题:
1)旋转Java设置,希望如果我关闭焦点,可能会将焦点控制交还给窗口管理器(到目前为止,我在父JFrame上尝试了"setFocusable(false)".这不起作用.线程" http://java.sun.com/javase/6/webnotes/trouble/TSG-Desktop/html/awt.html#gdaao "表示我应该改为"Window.setFocusableWindowState(false)"这个GUI有问题但是我还没有完全相信Java会重新关注焦点
2)使用JNI在Java程序中进行低级X调用.我认为这可能会奏效,但是,我从来没有玩过低级别的X.我不确定我应该使用什么叫(XtSetKeyboardFocus()应该是危险的...)或者我如何识别我正在操作的GUI(在这方面fvwm很好,因为他们有一个GUI,允许你点击另一个GUI,找出它的"名称"和"类")
3)使用"更强大"的窗口管理器.一些不使用ICCCM的窗口管理器可能能够更好地处理Java.当然,有太多的经理人,我不知道该集中精力.同样,很多人似乎都缺乏通过app指定焦点(大多数似乎只关心广泛的政策).
这是 JFrame
package client.connection;
import java.awt.Dimension;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import javax.swing.JFrame;
class DrawFrameRemoteControl extends JFrame
{
private DrawPanelRemoteControl imagePanel;
private ClientRemoteControlConnection clientRemoteControlConnection;
private ObjectInputStream clientInputStream;
private ObjectOutputStream clientOutputStream;
private Dimension imageDimension;
private Dimension serverDimension;
public DrawFrameRemoteControl(Dimension imageDimension,ClientRemoteControlConnection clientRemoteControlConnection,ObjectInputStream clientInputStream,ObjectOutputStream clientOutputStream,Dimension serverDimension)
{
super("Remote Desktop Control");
this.clientRemoteControlConnection=clientRemoteControlConnection;
this.clientInputStream=clientInputStream;
this.clientOutputStream=clientOutputStream;
this.imageDimension=imageDimension;
this.serverDimension=serverDimension;
imagePanel=new DrawPanelRemoteControl(imageDimension);
add(imagePanel);
setSize(imageDimension.width,imageDimension.height);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
setLocationRelativeTo(null);
}
void drawNewImageGrayscale(byte[] array)
{
imagePanel.setNewImageGrayscale(array);
imagePanel.repaint();
}
}
Run Code Online (Sandbox Code Playgroud)
这是扩展的JPanel类 -
package client.connection;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit; …Run Code Online (Sandbox Code Playgroud)