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

繰り返しますが、null レイアウトは使用しないでください。GUI の更新と保守が必要以上に難しくなり、複数のプラットフォームで実行する予定がある場合は GUI が見苦しくなる可能性があります。その代わり

  • 複数の 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 JButton の右側に「exit」JButton という別のボタンを追加するとします。null レイアウトを使用した場合は、GUI のサイズを変更する必要があり、送信ボタンを左に移動して、計算にエラーがないことを確認する必要があります。レイアウト マネージャーを使用した場合は、わずか 2 行の新しいコード (もちろん機能ではなく、表示を変更するため):

  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 に答える