2

由于我是一个初学者并且我不想参与布局管理器,所以我只是在我的主 JFrame 中添加了一个 JPanel,并为面板中的每个组件提供了特定的位置。但不知何故,输出似乎太错误了..

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);

这个框架的结果是文本区域是不可见的,中间有一个 You: 标签,右边是按钮。我在这里缺少什么?

4

1 回答 1

14

同样,不要使用空布局,因为它会使更新和维护您的 GUI 比应有的困难得多,并且如果您计划让它们在多个平台上运行,可能会导致丑陋的 GUI。反而

  • 使用多个 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,如下所示:
在此处输入图像描述

现在假设您要更改它并添加另一个按钮,即在发送 JButton 右侧的“退出”JButton。如果您使用空布局,则必须调整 GUI 的大小,必须将发送按钮移到左侧并确保您的数学没有错误等。如果您使用布局管理器,则需要只需两行新代码(更改显示,当然不是功能):

  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

就是这样,这将显示:
在此处输入图像描述

于 2012-12-17T02:22:20.490 回答