【问题标题】:JFrame initially appears with a maximum width limited to my monitor widthJFrame 最初出现的最大宽度限制为我的显示器宽度
【发布时间】:2019-04-12 10:40:36
【问题描述】:

我的一个程序中的 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 的演示中复制/粘贴的,剪掉了一些 cmets 以保持简短。

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();
            }
        });
    }
}

【问题讨论】:

  • 这个“可能”是操作系统的限制
  • 我开始认为可能是这种情况。我了解到 JFrame 与 GraphicsConfiguration (gc) 相关联。由于我所有的 gc 设备的大小都是 1920x1080,我开始认为 JFrame 可能会限制在这个大小。
  • 有趣的是,如果我调用 frame.setMinimumSize(new Dimension 3500,100));就在 pack 语句之前,窗口出现在两个监视器上。不过我不想在真正的程序中这样做。
  • 是和不是。您可以拥有比物理屏幕更大的窗口,尽管在 MacOS 上您会对结果感到失望。经过“大量”挖掘后,似乎对setVisible 的调用实际上是罪魁祸首。 pack 将尊重内容的首选大小,但由于某种原因,在调用 setVisible 之后,窗口被限制为监视器的大小,我无法找到完成的确切“位置”。 “A”有点“讨厌”的解决方案会在调用 setVisible 之后再调用 pack ????
  • 这并不讨厌 - 这是一个解决讨厌问题的绝妙方法!你是怎么想出来的?

标签: java swing jframe


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-03-25
    • 2011-10-18
    • 1970-01-01
    • 2013-05-14
    • 2019-08-06
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 2012-11-13
    相关资源
    最近更新 更多