【发布时间】:2019-04-12 10:40:36
【问题描述】:
我的一个程序中的 java JFrame 类遇到了一个奇怪的问题。谢天谢地,我能够使用来自 Oracle 网站的 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???? -
这并不讨厌 - 这是一个解决讨厌问题的绝妙方法!你是怎么想出来的?