我想写一个JFrame
,它的内容可以改变大小。 JFrame
应根据其内容的大小进行调整。此外,JFrame
不应调整大小。
这是我的代码:
public class MyFrame {
public static void main(String[] args) {
new MyFrame();
}
private JFrame frame;
private JLabel label;
private boolean labelVisible = false;
public MyFrame() {
label = new JLabel("label");
frame = new JFrame();
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new GridLayout(0, 1, 5, 5));
frame.getContentPane().add(createButton());
frame.pack();
frame.setVisible(true);
}
private JButton createButton() {
JButton button = new JButton("toggleLabel");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (labelVisible) {
frame.getContentPane().remove(label);
} else {
frame.getContentPane().add(label);
}
labelVisible = !labelVisible;
frame.pack();
System.out.println(frame.getLocation());
}
});
return button;
}
}
问题是:如果我调整 JFrame
的大小(通过添加或删除标签),JFrame
会更改其位置(它向下移动一点)。但是,如果我删除 frame.setResizable(false)
行,JFrame
的位置将不再更改。
我能做点什么吗?我可以有一个不能由用户调整大小但由代码调整大小的 JFrame
吗?
编辑:
这是多次单击按钮后的输出:
java.awt.Point[x=75,y=62]
java.awt.Point[x=75,y=90]
java.awt.Point[x=75,y=118]
java.awt.Point[x=75,y=146]
java.awt.Point[x=75,y=174]
java.awt.Point[x=75,y=202]
java.awt.Point[x=75,y=230]
java.awt.Point[x=75,y=286]
java.awt.Point[x=75,y=286]
java.awt.Point[x=75,y=314]
java.awt.Point[x=75,y=342]
如您所见,y 坐标随着每次点击而增加。
<小时/>编辑2:
正如 @camickr 在评论中指出的那样,这似乎是一个特定于平台的问题。
我使用 Ubuntu 14.04 64 位和 java-7-oracle 64 位 (1.7.0_67)。
最佳答案
我使用完全相同的代码,输出如下:
java.awt.Point[x=894,y=493]
java.awt.Point[x=894,y=493]
java.awt.Point[x=894,y=493]
java.awt.Point[x=894,y=493]
java.awt.Point[x=894,y=493]
java.awt.Point[x=894,y=493]
java.awt.Point[x=894,y=493]
java.awt.Point[x=894,y=493]
java.awt.Point[x=894,y=493]
这可能是与平台相关的问题...
关于java - 不可调整大小的 JFrame 更改 pack() 上的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25475972/