不可调整大小的JFrame更改pack()上的位置

时间:2014-08-24 20:21:49

标签: java swing user-interface resize jframe

我想写一个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)。

2 个答案:

答案 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]

这可能是与平台有关的问题......