嗯,大家好。 对于我来说,使用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
感谢您抽出时间阅读我的问题,就是这样。