【发布时间】:2014-01-24 00:31:59
【问题描述】:
我正在处理一个复杂的 java swing 项目。 在初始化期间,我将帧大小设置为 1280X1024。 有时当我启动我的应用程序时,框架以预期的尺寸开始 其他时候框架的实际大小是 1282X1053(总是这个大小)。
我有两个问题,同时试图查明这个问题的根源。
1) 有没有办法在帧大小改变时设置观察点? 我正在使用 eclipse,当我尝试设置观察点时,当我拥有的每个组件都更改大小时它会中断。这是不可接受的,因为我要手动跟踪的组件太多。
2) 由于问题并非每次都重现,我担心我可能在代码中的某个地方访问 EDT 之外的 Java swing 组件。有没有办法验证我的代码中对所有 Swing 组件的所有调用都是从 EDT 完成的?
编辑:
以下代码是我使用的示例。
我无法附加代码来构建面板,因为它太复杂了,不适合这里
编辑 2:下面的代码有效。问题是由于调用 setVisible 之前的注释行而发生的
package com.earlysense.nursestation;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.lang.reflect.InvocationTargetException;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class MyFrame extends JFrame {
private JPanel west;
private JPanel center;
/**
* Initializes the panels
*/
public void init() {
setLocation(0, 0);
setPreferredSize(new Dimension(1280, 1024));
setUndecorated(true); // The frame is fixed. It cannot be moved or resized.
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel p = new JPanel(new BorderLayout());
west = new JPanel();
west.add(new JLabel("west"));
center = new JPanel();
center.add(new JLabel("center"));
p.add(BorderLayout.WEST, west);
p.add(BorderLayout.CENTER, center);
getContentPane().add(p);
}
public static void main(String[] args) {
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
MyFrame frame = new MyFrame();
frame.init();
frame.pack();
// at this point frame.getSize() returns 1280X1024
// add components to west and center panel which depends on the frame size to set self size
frame.setVisible(true);
// at this point frame.getSize() sometimes returns 1282X1053
}
});
} catch (InterruptedException e) {/* Do nothing */
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
【问题讨论】:
-
“有没有办法验证我的代码中对所有 Swing 组件的所有调用都是从 EDT 完成的?” -
SWingUtilities.isEventDispatchThread() -
这个问题不是很有趣,在应用程序启动时不需要测试 EDT,更多见see Initial Thread,它必须在那里使用......,注意避免硬编码对于 set(Xxx)Size,那么 JFrame.pack() 必须(每次和永远)返回所需的 Rectangle
-
你能添加你用来设置JFrame大小的代码吗?
-
@peeskillet 这是一种验证单个调用是否从 EDT 完成的方法。我可以在我的代码中找到所有对 swing 组件的调用,因此不能选择使用此检查来包装每个调用。
-
我正在查看您的 MCVE,但我并没有真正理解手头的问题。我应该寻找这个程序的确切问题是什么?