如何正确使用JFrame.pack()?

时间:2018-10-05 09:35:55

标签: java

嗯,大家好。 对于我来说,使用Pack方法是为了以最小的尺寸存储,它仍然可以容纳框架中的所有元素。(如果不舒服,请纠正我)。

但是我认为我没有以正确的方式使用它。 我试图在jpanel下的框架中添加一些装饰。 然后我调用了pack方法,并且框架将其自身适合于组件。

在我使用JFrame.removeAll()删除了所有旧组件之后,我在新的JPanel下添加了新组件。并再次调用了pack方法,但是这次乞讨的面板的最小尺寸不能容纳第一个JPanel而不是新的JPanel。

我的代码:

public Window() {
    frame = new JFrame("Auto VPN Connection");
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    addInstace("loading", new JPanel());
    JPanel panel = getInstance("loading");
    panel.setSize(new Dimension(300, 200));
    JLabel label = new JLabel();
    label.setText("Loading..");
    panel.add(label);
    frame.add(panel);
    frame.pack();
    frame.show();
    Start();
}

public void clearFrame() {
    if (frame.getContentPane().getComponents().length > 0)
        frame.removeAll();
}

public void Start() {
    addInstace("home", new JPanel());
    JPanel panel = getInstance("home");
    panel.setSize(new Dimension(500, 300));
    JButton button = new JButton();
    button.setSize(new Dimension(200, 30));
    panel.setLayout(null);
    button.setText("Welcome");
    panel.add(button);
    frame.add(panel);
    frame.pack();
    frame.revalidate();
}

public JPanel getInstance(String name) {
    for (Pair<String, JPanel>key : array) {
        if (key.getLeft().equalsIgnoreCase(name))
            return key.getRight();
    }
    return null;
}

public void addInstace(String name, JPanel panel) {
    if (!instanceExists(name)) {
        array.add(new Pair<>(name, panel));
    } else {
        System.out.print("Exists!");
    }
}

public boolean instanceExists(String name) {
    for (Pair<String, JPanel>key : array) {
        if (key.getLeft().equalsIgnoreCase(name))
            return true;
    }
    return false;
}

如果我没有在Start()中调用pack方法,那么框架包本身就是JLabel的大小,没关系。

但是,如果我再次在Start()中调用pack方法,则框架不会将其自身打包到JLabel和JButton。

以下是一些检查我情况的照片:

Pack not called in the Start method

Pack is now called in the Start method

感谢您抽出时间阅读我的问题,就是这样。

0 个答案:

没有答案