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

前端之家收集整理的这篇文章主要介绍了java – 不可调整大小的窗口边框和定位前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我创建不可调整大小的JFrame,并且启用了 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:

Aero Off:

Aero On但可调整大小:

解决方法

What are the problems with settings bounds on non-resizable containers?

假设您调整边界以在平台上看起来很好.假设用户的平台具有不同的字体,比如说更大的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 https://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,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相关文章