如果我创建不可调整大小的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但可调整大小:
答案 0 :(得分:7)
不可调整大小的容器上的设置边界有什么问题?
假设您调整边界以在平台上看起来很好。假设用户的平台有一个不同的字体,比如说大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();
}
});
}
}
答案 1 :(得分:5)
似乎这不是Java问题,而是aero appcompat问题,如here所述。
我在Java中看到的一个解决方案是让窗口可以调整大小,然后解决setMaximumSize bug