JFrame最初显示时的最大宽度限制为我的监视器宽度

时间:2018-11-08 20:50:38

标签: java swing jframe

我的一个程序中的java JFrame类遇到一个奇怪的问题。值得庆幸的是,我可以使用从Oracle网站获取的FrameDemo.java示例来复制此问题:

https://docs.oracle.com/javase/tutorial/displayCode.html?code=https://docs.oracle.com/javase/tutorial/uiswing/examples/components/FrameDemoProject/src/components/FrameDemo.java

我将emptyLabel的尺寸更改为(3005,100),然后编译并启动程序。在我的双监视器显示器上,我希望框架几乎跨过两个监视器(它们各自的宽度为1920像素)。

相反,我看到的是JFrame的大小适合单个监视器的宽度。我似乎无法跨两个监视器打开窗口。我在这里做错什么了吗?我正在Centos 7.5上运行,并且正在使用jdk 1.8.0_60。

确切的代码显示在下面。它主要是Oracle演示的副本/粘贴,并保留了一些注释以使其简短。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/* FrameDemo.java requires no other files. */
public class FrameDemo {
    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("FrameDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JLabel emptyLabel = new JLabel("blahblah");
        emptyLabel.setPreferredSize(new Dimension(3005, 100));
        frame.getContentPane().add(emptyLabel, BorderLayout.CENTER);

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

1 个答案:

答案 0 :(得分:0)

非常感谢MadProgrammer。不幸的是,在我更复杂的程序中,第二次调用pack似乎没有成功。

我最终选择的解决方法是计算所有组件的累计宽度(它们已加载到JSplitPane中)。这等于左窗格,右窗格和分隔线的宽度。如果此累积宽度超过监视器的宽度,则将最小帧尺寸设置为此累积宽度。这似乎可以确保框架出现时可以跨越两个监视器。然后,在使内容可见后,我将最小大小重置为在启动时保存的值。这样,我的JFrame可以显示在两个屏幕上,但仍可以调整为较小的尺寸。

这确实是一个令人讨厌的解决方法。我已经将此错误报告给http://bugs.java.com。它被列为以下错误:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8213620