Java.awt:未显示第二个TextArea

时间:2014-09-21 13:25:53

标签: java awt uitextarea

我试图了解Java.awt的工作原理(我们需要在没有GUI编辑器的情况下创建GUI)

以下代码未显示2个TextAreas:

Frame fr = new Frame("Parser");
Panel buttons = new Panel();
Panel inputText = new Panel();
Panel outputText = new Panel();
String here = new String ("Insert code here...");
TextArea input = new TextArea(here, 9, 96, TextArea.SCROLLBARS_VERTICAL_ONLY);
TextArea output = new TextArea(here, 9,96,TextArea.SCROLLBARS_VERTICAL_ONLY);

public Window(){
    fr.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                fr.dispose();
             }
         }
    );

    fr.setSize(700, 400);
    fr.setLocation(200,100);
    fr.setResizable(false);

    fr.add(buttons);
    fr.add(inputText);
    fr.add(outputText);

    buttons.setBounds(new Rectangle(0,0,700,60));
    buttons.setBackground(new Color(200,200,200));

    inputText.setBounds(new Rectangle(0,60,700,170));
    inputText.setBackground(new Color(255,255,255));
    inputText.add(input);

    outputText.setBounds(new Rectangle(0,230,700,170));
    outputText.setBackground(new Color(200,200,200));
    outputText.add(output);

}

获得的结果:

Window with only 1 text area

预期结果:

enter image description here

2 个答案:

答案 0 :(得分:3)

您的代码不尊重容器正在使用的布局管理器。我相信AWT框架默认使用BorderLayout(根据Frame API编辑:是的。建议:

  • 一般来说,避免AWT for Swing具有更强大的功能和灵活性,虽然它也显示出它的年龄,但不如AWT。
  • 以智能方式阅读并使用布局管理器为您完成繁重的任务。这看起来像BoxLayout可以帮助你。
  • 避免使用null布局。虽然是的,这可以为您提供对当前代码的快速而简单的修复,但它会导致创建非常不灵活的GUI,虽然它们在一个平台上看起来很好但在大多数其他平台或屏幕分辨率上看起来很糟糕而且很难更新和维护。
  • 避免设置任何组件的边界,大小或位置,并再次让组件及其容器的布局管理器为您设置大小。


例如:

import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.*;

public class MyWindow extends JPanel {
   private static final int ROWS = 10;
   private static final int COLS = 50;
   private static final String[] BUTTON_NAMES = { "Monday", "Tuesday",
         "Wednesday", "Thursday", "Friday" };
   private static final int GAP = 3;
   private JTextArea inputTextArea = new JTextArea(ROWS, COLS);
   private JTextArea outputTextArea = new JTextArea(ROWS, COLS);

   public MyWindow() {
      JPanel buttonPanel = new JPanel(new GridLayout(1, 0, GAP, 0));
      for (String btnName : BUTTON_NAMES) {
         buttonPanel.add(new JButton(btnName));
      }
      outputTextArea.setFocusable(false);
      outputTextArea.setEditable(false);

      setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
      setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
      add(buttonPanel);
      add(putInTitledScrollPane(inputTextArea, "Input Text"));
      add(putInTitledScrollPane(outputTextArea, "Output Text"));
   }

   private JPanel putInTitledScrollPane(JComponent component,
         String title) {
      JPanel wrapperPanel = new JPanel(new BorderLayout());
      wrapperPanel.setBorder(BorderFactory.createTitledBorder(title));
      wrapperPanel.add(new JScrollPane(component));
      return wrapperPanel;
   }

   private static void createAndShowGui() {
      MyWindow mainPanel = new MyWindow();

      JFrame frame = new JFrame("MyWindow");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

显示为:

enter image description here

在更改或增强GUI时,使用布局管理器可以更轻松。例如,由于我使用COL常量设置JTextArea的宽度,如果我更改COL常量,整个GUI会加宽,甚至是按钮和按钮JPanel,因为布局管理器正在处理所有大小调整。使用您的代码,您必须手动更改添加到GUI的每个组件的宽度,这很容易产生错误。

答案 1 :(得分:1)

由于您手动布置组件,因此需要将布局设置为null(setLayout(null);
所以在添加任何组件之前,请在代码中添加此行。

fr.setLayout(null);

现在你将得到这个:enter image description here