当您选择一个状态时,框架的内容窗格会删除其组件。然后根据您选择的状态,另一个类将获取内容窗格并将其添加到其中。这样做之后,框架会被打包以相应地调整大小。
我想自由控制 Frame 中的内容,例如能够将面板并排放置,彼此重叠,等等。所以我真的不想使用 CardLayout。(我宁愿让 1 个面板同时处理登录屏幕和聊天。然后,能够在该面板旁边显示另一个面板)。
我在登录和聊天屏幕中使用了 JFrame 的内容窗格,但是当我运行我的代码时,我得到了一个内部为白色的小框架(有一些大小,但几乎没有)。
- 显示框架
- 切换到聊天
- 删除窗格上的所有内容(目前没有)
- 将组件添加到窗格中
- 打包框架,以便它可以根据窗格调整大小
- 如果需要重新验证(不确定何时需要重新验证)
请告诉我我做错了什么,也许可以引导我朝着正确的方向前进。PS:没有错误
编辑:我唯一能想到的是,由于我正在frame.getContentPane()
通过方法,并且方法是按值传递的,因此实际引用frame.getContentPane()
可能没有注意到我要求的更改。但后来我不知道为什么框架的内部会是白色的(好像我的 JTextArea 尝试渲染),并且框架内部有填充,所以必须发生一些事情..
主.java:
package main;
import ui.Frame;
public class Main {
public static Frame frame = new Frame();
public static void main(String[] args) {
frame.show();
frame.switchState(State.chat);
}
public static enum State {
login, chat;
}
}
框架.java:
package ui;
import main.Main.State;
import javax.swing.JFrame;
public class Frame {
private Panel currentpanel; //from package ui, not AWT
private ChatPanel chatpanel = new ChatPanel();
private JFrame frame;
public Frame() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
}
public void show() {
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public void switchState(State state) {
frame.removeAll();
switch(state) {
case chat:
currentpanel = chatpanel;
currentpanel.addComponentsTo(frame.getContentPane());
break;
}
frame.pack();
frame.revalidate();
}
}
面板.java:
package ui;
import java.awt.Container;
public interface Panel {
public void addComponentsTo(Container pane);
}
聊天面板.java:
package ui;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JTextArea;
public class ChatPanel implements Panel {
private JTextArea toparea = new JTextArea();
private JTextArea bottomarea = new JTextArea();
@Override
public void addComponentsTo(Container pane) {
pane.setPreferredSize(new Dimension(500, 500));
pane.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridy = 0;
gbc.gridx = 0;
gbc.ipadx = 450;
gbc.ipady = 350;
pane.add(toparea, gbc);
gbc.gridy = 1;
gbc.ipady = 100;
pane.add(bottomarea);
}
}