有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用JFrame。pack()正确吗?

嘿,伙计们。 在我看来,使用Pack方法是为了以最小的大小存储,以便仍然可以保存框架内的所有元素。(如果我在工作,请纠正我)

但我认为我使用它的方式不对。 我试着在一个jpanel下的框架中添加一些组件。 然后我调用了pack方法,框架适合组件本身

在我使用JFrame删除所有旧组件之后。removeAll(),我在一个新的JPanel下添加了新的组件。并再次调用了pack方法,但这次begging面板的最小尺寸不能容纳第一个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) 个答案