我正在开发一个复杂的java swing项目。 在初始化期间,我将帧大小设置为1280X1024。 有时当我启动我的应用程序时,框架以预期的尺寸开始 其他时候帧的实际大小是1282X1053(总是这个大小)。
我有两个问题,同时试图查明此问题的来源。
1)有没有办法在帧大小改变时设置观察点? 我正在使用eclipse,当我试图设置一个观察点时,它会在我改变大小的每个组件时中断。这是不可接受的,因为我有太多的组件要手动跟随。
2)由于问题不会每次都重现,我担心可能在代码中的某处我访问EDT之外的Java 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();
}
}
}
答案 0 :(得分:2)
这似乎是java中的一个错误。 在java 1.3中已知,但显然仍然会发生。我正在使用ubuntu 13.10 64bit,jdk:OpenJDK运行时环境(IcedTea6 1.12.6)(6b27-1.12.6-1ubuntu2.1) link
答案 1 :(得分:-1)
我将帧大小设置为1280X1024。
为什么呢?我的屏幕是1024 x 768,所以我想我不能使用你的应用程序?不要硬编码值。而是使用:
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
SwingUtilities.invokeAndWait(new Runnable(){
为什么使用invokdeAndWait?所有Swing教程和论坛中人员的建议都使用invokeLater(..)
。