我是 Java 新手,主要是 CardLayout。我想简单地切换 JPanel 代表的“窗口”。我在某处读到了 CardLayout 的工作。但我的问题是,当 add chatPanel
到 mainPanel
(这是 CardLayout 的)时,它会将 connectPanel
的内容移动到顶部几个像素,远离其中心位置。我是否跳过代码 createChatPanel(),
它应该在的位置。
我有这个代码:
package App;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import Validators.*;
public class GUI {
private JFrame mainFrame = null;
private JPanel mainPanel = null;
private CardLayout cl = new CardLayout();
public GUI(){
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (UnsupportedLookAndFeelException e) {
}
catch (ClassNotFoundException e) {
}
catch (InstantiationException e) {
}
catch (IllegalAccessException e) {
}
mainFrame = new JFrame("MainChat");
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setSize(640,480);
mainFrame.setLocationRelativeTo(null);
mainFrame.setResizable(false);
mainFrame.setLayout(new GridBagLayout());
JMenuBar menuBar = new JMenuBar();
JMenu menuFile = new JMenu("Soubor");
JMenu menuHelp = new JMenu("Nápověda");
menuBar.add(menuFile);
menuBar.add(menuHelp);
menuFile.add(new JMenuItem("Nové Připojení"));
menuFile.add(new JSeparator());
menuFile.add(new JMenuItem("Konec"));
menuHelp.add(new JMenuItem("O programu"));
mainFrame.setJMenuBar(menuBar);
createMainPanel();
createConnectPanel();
createChatPanel();
mainFrame.setVisible(true);
}
public void createMainPanel() {
mainPanel = new JPanel(cl);
mainFrame.add(mainPanel);
}
public void createConnectPanel() {
JPanel connectPanel = new JPanel();
mainPanel.add(connectPanel,"connectPanel");
JTextField ip = new JTextField();
ip.setDocument(new JTextFieldLimit(15));
ip.setColumns(11);
JLabel iplabel = new JLabel("IP:");
connectPanel.add(iplabel);
connectPanel.add(ip);
JButton connect = new JButton("Connect");
connect.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cl.show(mainPanel,"chatPanel");
}
});
connectPanel.add(connect);
}
public void createChatPanel(){
JPanel chatPanel = new JPanel();
mainPanel.add(chatPanel,"chatPanel");
JTextArea chatbox = new JTextArea();
chatbox.setPreferredSize(new Dimension(200,200));
chatPanel.add(chatbox);
}
}
请问我搞砸了什么?谢谢。
最佳答案
由于您要向主 JPanel 添加两个 JPanel, 这两个面板都需要适合主面板。
如果其中一个内面板比另一个大得多, 主面板将进行调整以适应较大的面板。
例如评论这一行:
chatbox.setPreferredSize(new Dimension(200,200));
会导致您的文本字段保持不变。这是因为 聊天框不会导致容器调整大小。
另请注意,主面板最初的大小与您的大小不同 主框架,因为您还没有设置主面板的大小。
如果您将 connectPanel 的大小设置为相同的大小 作为您的主框架, connectPanel 不会 添加 chatPanel 时自动调整大小(作为 调整 mainPanel 大小的结果)
所以你可以做的就是添加中间线:
JPanel connectPanel = new JPanel();
connectPanel.setSize(640, 480);
mainPanel.add(connectPanel, "connectPanel");
,这可能会解决您的问题。
虽然这可行,但我绝对推荐使用 MIG Layout为了 您所有的 GUI 设计。它将为您节省大量时间,如果 你需要一个小时来学习它。它还将使您免于 必须手动设置尺寸(从而使您免于 每次设计更改都必须重写一半的 GUI 代码)。
关于当添加第二个 JPanel 时,Java CardLayout JPanel 向上移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5695387/