【问题标题】:JFrame size change unintentionally during runtimeJFrame 大小在运行时无意中更改
【发布时间】: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,但我并没有真正理解手头的问题。我应该寻找这个程序的确切问题是什么?

标签: java swing


【解决方案1】:

这似乎是java中的一个错误。 在 java 1.3 中已知,但显然仍然会发生。我使用的是 ubuntu 13.10 64bit,jdk:OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1ubuntu2.1) link

【讨论】:

    【解决方案2】:

    我将帧大小设置为 1280X1024。

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

    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    

    SwingUtilities.invokeAndWait(new Runnable() {

    您为什么使用 invokdeAndWait?论坛里所有的 Swing 教程和建议都使用invokeLater(..)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-05
      • 1970-01-01
      • 2022-01-17
      • 2012-10-15
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多