我想写一个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坐标随着每次点击而增加。
EDIT2:
正如@camickr在评论中指出的那样,它似乎是一个特定于平台的问题。
我正在使用64位的Ubuntu 14.04和java-7-oracle 64位(1.7.0_67)。
答案 0 :(得分:2)
正如我已经说过的,我没有遇到任何问题。我没有看到基本代码的问题。也许这是一个版本/平台错误?
作为一项工作,你应该可以做类似的事情:
Point location = frame.getLocation();
frame.pack();
frame.setLocation( location );
答案 1 :(得分:2)
我使用完全相同的代码,输出是这样的:
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]
这可能是与平台有关的问题......