Jframe尺寸在运行时无意间变化



我正在研究一个复杂的Java秋千项目。在初始化期间,我将帧大小设置为1280x1024。有时,当我启动应用程序时,框架以预期的尺寸开头其他时候,框架实际尺寸为1282x1053(总是这样的大小)。

我有两个问题,试图查明此问题的来源。

1)有没有办法在更改框架大小的时候设置观察点?我使用的是Eclipse,当我尝试设置一个手表时,当我具有更改尺寸的每个组件时,它会破裂。这是不可接受的,因为我有太多的组件可以手动遵循。

2)由于该问题并非每次都重现,我担心代码中的某个地方我可以访问EDT之外的Java Swing组件。是否有一种方法可以验证我代码中所有对所有摆动组件的调用?

编辑:以下代码是我使用的示例。
我无法附加代码以构建面板,因为它太复杂了,无法在此处适合

编辑2:下面的代码有效。问题是因为在调用setvisible

之前发表了评论的行之E
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();
        }
    }
}

它似乎是Java中的一个错误。在Java 1.3中闻名,但显然仍在发生。我正在使用Ubuntu 13.10 64bit,JDK:OpenJDK运行时环境(ICEDTEA6 1.12.6)(6B27-1.12.6-12.6-1ubuntu2.1)链接

我将帧大小设置为1280x1024。

为什么?我的屏幕是1024 x 768,所以我想我无法使用您的应用程序?不要硬码值。而是使用:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

swingutilities.invokeandwait(new Runnable(){

为什么要使用InvokDeanDwait?论坛中人们的所有秋千教程和建议使用invokeLater(..)

最新更新