不可resize的窗口边框和位置

如果我创build不可resize的JFrames,并启用Windows Aero setLocation似乎不正确地考虑到窗口边框。

在下面的代码中,我期望第二帧被定位在第一帧的右侧,而不是边界重叠。 如果Aero被禁用,或者我删除了setResizable的调用,则按照预期完成。

 import java.awt.Rectangle; import javax.swing.JFrame; public class FrameBorders { public static void main(String[] args) { JFrame frame1 = new JFrame("frame 1"); JFrame frame2 = new JFrame("frame 2"); frame1.setResizable(false); frame2.setResizable(false); frame1.setVisible(true); Rectangle bounds = frame1.getBounds(); frame2.setLocation(bounds.x+bounds.width, bounds.y); frame2.setVisible(true); } } 

我做错了什么或者这是一个错误? 我怎样才能显示2个不可重复的对话框,并没有重叠的边界?

编辑:添加屏幕截图(也将frame2更改为一个JDialog而不是一个JFrame)

Aero On: 航空上

Aeroclosures: Aero关闭

航空虽然可resize: 航空上,但可以调整大小

在不可resize的容器上设置边界有什么问题?

假设你调整了界限在你的平台上看起来不错。 假设用户的平台具有不同的字体,比如FontMetrics 。 这个例子有些做作,但你明白了。 如果更改不可resize的容器的边界,请确保任何文本都可见,而不pipe主机平台的默认字体。

图片

 import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; /** * @see http://stackoverflow.com/a/12532237/230513 */ public class Evil extends JPanel { private static final String s = "Tomorrow's winning lottery numbers: 42, "; private JLabel label = new JLabel(s + "3, 1, 4, 1, 5, 9", JLabel.LEFT); public Evil() { this.add(label); } private void display() { JFrame f = new JFrame("Evil"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(this, BorderLayout.WEST); f.pack(); int w = SwingUtilities.computeStringWidth( label.getFontMetrics(label.getFont()), s); int h = f.getHeight(); f.setSize(w, h); f.setResizable(false); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new Evil().display(); } }); } } 

看起来,这不是一个Java问题,而是一个航空appcompat问题,如下所述。

我在Java中看到的一个解决scheme是让窗口可resize,然后解决setMaximumSize错误