Java 不可调整大小的窗口边框和定位

Java 不可调整大小的窗口边框和定位,java,windows,swing,aero,absolutelayout,Java,Windows,Swing,Aero,Absolutelayout,如果我创建了不可调整大小的JFrames,并且启用了windows Aero,setLocation似乎没有正确考虑窗口边框 在下面的代码中,我希望第二帧位于第一帧的右侧,而不是边界重叠。如果Aero被禁用,或者如果我删除了对setresizeable的调用,这将按预期完成 import java.awt.Rectangle; import javax.swing.JFrame; public class FrameBorders { public static void main(String

如果我创建了不可调整大小的JFrames,并且启用了windows Aero,
setLocation
似乎没有正确考虑窗口边框

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

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已打开但可调整大小:

不可调整大小的容器上的设置边界有什么问题

假设您调整边界,使其在平台上看起来很好。假设用户平台的字体不同,比如说更大,
FontMetrics
。这个例子有点做作,但你明白了。如果更改不可调整大小的容器的边界,请确保无论主机平台的默认字体如何,任何文本都可见

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问题,而是aero appcompat问题


我在Java中看到的一个解决方案是,让窗口可以调整大小,然后围绕

解决问题。为什么要并排显示两个不可调整的对话框而没有重叠的边框?我想显示两个最初并排放置的窗口。请不要在不可调整大小的容器上设置任意边界。看到了吗?当您设置JFrame#getRootPane().setBorder(someBorder);,因为Areo在底部和左侧有阴影side@mKorbel设置边框将设置内部边框,但对窗口边框没有影响就调整大小而言,这是一个很好的观点(如果单独设置,这将是对我在评论中提出的问题的一个很好的回答),但是我最初的问题是定位。假设使用pack()/没有文本/大小将不会改变,甚至不会像我自己设计的示例中那样出现空对话框/框架。请尝试使用
pack()
,这“会使此
窗口的大小符合其子组件的首选大小和布局。”;显示您描述的问题的示例可能会有所帮助。在这种情况下,pack()没有任何区别,因为窗口是空的(这就是为什么我没有在示例中包含它)。修改代码以使其可编译(仅添加了导入和主类…)。如果你不使用Aero,你将不会有这个代码的任何问题,因为这个问题只存在于Aero(见截图)良好的链接;平台拥有框架装饰,因此结果并不完全离谱
aqua
也有类似的异常情况。