Java 在JFrame中向JPanel添加组件
因为我是一个初学者,我不想参与到布局管理器中,所以我只是简单地将一个JPanel添加到我的主JFrame中,并为面板中的每个组件提供特定的位置。但不知何故,输出结果似乎太错误了Java 在JFrame中向JPanel添加组件,java,swing,jframe,jpanel,layout-manager,Java,Swing,Jframe,Jpanel,Layout Manager,因为我是一个初学者,我不想参与到布局管理器中,所以我只是简单地将一个JPanel添加到我的主JFrame中,并为面板中的每个组件提供特定的位置。但不知何故,输出结果似乎太错误了 frame = new JFrame(email + " (Offline)"); frame.setSize(400, 400); frame.setLocation(0, 0); frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE
frame = new JFrame(email + " (Offline)");
frame.setSize(400, 400);
frame.setLocation(0, 0);
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.setLayout(new FlowLayout());
frame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
// out.println("BYE");
// out.flush();
frame.dispose();
thread.stop();
}
});
panel = new JPanel();
frame.add(panel);
chat = new JTextArea();
chat.setSize(400, 200);
chat.setLocation(0, 0);
chat.setEditable(false);
panel.add(chat);
panel.validate();
JLabel you = new JLabel("You:");
you.setSize(you.getPreferredSize());
you.setLocation(0, 210);
panel.add(you);
panel.validate();
input = new JTextArea();
input.setSize(200, 200);
input.setLocation(0, 220 + chat.getSize().height);
panel.add(input);
panel.validate();
send = new JButton("Send");
send.setSize(send.getPreferredSize());
send.setLocation(210, 220 + chat.getSize().height);
panel.add(send);
panel.validate();
frame.setVisible(true);
<>这个框架的结果是文本区域是不可见的,你是:标签在中间,右边是按钮。我在这里遗漏了什么?再次强调,不要使用空布局,因为它使更新和维护GUI变得比应该的困难得多,并且如果您计划在多个平台上运行GUI,可能会导致丑陋的GUI。反而
- 使用几个JPanel,每个JPanel包含一组核心组件,每个JPanel使用其最佳布局管理器
- 将这些JPanel嵌套在使用最佳布局管理器显示它们的其他JPanel中
- 这将允许您的GUI可以调整大小,而不需要额外的代码
- 将JTextAreas放在JScrollPanes中,这样即使超出文本区域,也可以看到所有文本
- 切勿设置JTextArea的大小,因为这将不允许它滚动。而是设置其列和行
import java.awt.*;
import javax.swing.*;
public class FooSwing2 {
public static void main(String[] args) {
JTextArea chatArea = new JTextArea(8, 40);
chatArea.setEditable(false);
chatArea.setFocusable(false);
JScrollPane chatScroll = new JScrollPane(chatArea);
JPanel chatPanel = new JPanel(new BorderLayout());
chatPanel.add(new JLabel("Chat:", SwingConstants.LEFT), BorderLayout.PAGE_START);
chatPanel.add(chatScroll);
JTextField inputField = new JTextField(40);
JButton sendBtn = new JButton("Send");
JPanel inputPanel = new JPanel();
inputPanel.setLayout(new BoxLayout(inputPanel, BoxLayout.LINE_AXIS));
inputPanel.add(inputField);
inputPanel.add(sendBtn);
JPanel youLabelPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
youLabelPanel.add(new JLabel("You:"));
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));
mainPanel.add(chatPanel);
mainPanel.add(Box.createVerticalStrut(10));
mainPanel.add(youLabelPanel);
mainPanel.add(inputPanel);
JFrame frame = new JFrame("Foo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
这将导致一个简单的(不起作用的)GUI,看起来像这样:现在,假设您想要更改此设置并添加另一个按钮,即send按钮右侧的“exit”按钮。如果使用空布局,则必须调整GUI的大小,必须将“发送”按钮移到左侧,并确保数学无误,等等。如果使用布局管理器,则只需要两行新代码(更改显示,当然不是功能): 就这样,这将显示:
版面管理器的全部目的就是让这变得更容易。我必须承认@BrianRoach刚刚发布的内容。避免使用布局管理器是对自己的一大伤害。只要看看这方面的教程(谷歌会帮你找到它们),然后试一试。。。但是我要说的是暂时避免GridBagLayout,因为它和GroupLayout是其中最复杂的。。我一直在检查布局,但似乎它们并没有像我所希望的那样灵活。但幸运的是,对于与我有完全相同问题的人,将setLayout设置为null。就像我在代码面板中所做的那样。setLayout(null)。这将允许您自由地为父级中的每个组件提供位置。我不会详细讨论以这种方式进行操作会导致问题的无数事情,因为很明显,您注定要做错事。我看不出
LayoutManager
有什么理由不能按您的要求做,可以理解的是,如果您不知道LayoutManager
s,那么使用setLayout(null)
似乎比使用它更难。但是当用户界面变得非常复杂时,空布局将是你的失败+1至所有评论和HFOEs答案
JTextField inputField = new JTextField(40);
JButton sendBtn = new JButton("Send");
JButton exitBtn = new JButton("Exit"); // ***** added
JPanel inputPanel = new JPanel();
inputPanel.setLayout(new BoxLayout(inputPanel, BoxLayout.LINE_AXIS));
inputPanel.add(inputField);
inputPanel.add(sendBtn);
inputPanel.add(exitBtn); // ***** added