Java.awt:未显示第二个TextArea

我正在尝试了解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);

}

获得的结果:

预期结果:

解决方法:

您的代码不尊重您的容器正在使用的布局管理器.我相信,默认情况下,AWT框架使用BorderLayout(编辑:是的,按照Frame API进行.):

>通常,请避免使用AWT for Swing,它具有更大的功能和灵活性,尽管它也显示了它的年龄,但比AWT的要短.
>阅读并以明智的方式使用布局管理器为您完成繁重的工作.在这里,BoxLayout可以为您提供帮助.
>避免使用空布局.是的,这可以为您提供当前代码的快速简便的修复程序,但会导致创建非常不灵活的GUI,尽管它们在一个平台上看起来可能不错,但在大多数其他平台或屏幕分辨率上却看起来很糟糕,而且很难做到更新和维护.
>避免设置任何组件的边界,大小或位置,然后再次让组件及其容器的布局管理器为您设置大小.

> The Layout Manager Tutorial

例如:

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

显示为:

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

上一篇:从HeadlessGraphicsEnvironment.getDefaultScreenDevice抛出的java.awt.HeadlessException


下一篇:java-单击按钮关闭窗口