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) 个答案