我的一个程序中的java JFrame
类遇到一个奇怪的问题。值得庆幸的是,我可以使用从Oracle网站获取的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();
}
});
}
}
答案 0 :(得分:0)
非常感谢MadProgrammer。不幸的是,在我更复杂的程序中,第二次调用pack似乎没有成功。
我最终选择的解决方法是计算所有组件的累计宽度(它们已加载到JSplitPane中)。这等于左窗格,右窗格和分隔线的宽度。如果此累积宽度超过监视器的宽度,则将最小帧尺寸设置为此累积宽度。这似乎可以确保框架出现时可以跨越两个监视器。然后,在使内容可见后,我将最小大小重置为在启动时保存的值。这样,我的JFrame可以显示在两个屏幕上,但仍可以调整为较小的尺寸。
这确实是一个令人讨厌的解决方法。我已经将此错误报告给http://bugs.java.com。它被列为以下错误:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8213620