java - 在位置设置按钮和TextAreas

时间:2015-04-08 02:59:26

标签: java swing jframe layout-manager placement

所以我一直在寻找这个问题的其他解决方案,但似乎它们都没有任何帮助。有人能帮助我吗?

代码:

public static void main(String[] args) {

    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    // Container cont = frame.getContentPane();
    JPanel buttonpanel = new JPanel();
    JButton[] button = new JButton[12];
    JTextArea score1, score2;
    score1 = new JTextArea(100, 200);
    score2 = new JTextArea(100, 200);

    frame.setSize(800, 600);
    frame.setVisible(true);
    score1.setLayout(null);
    score1.setBackground(Color.BLUE);
    score2.setLayout(null);
    score2.setBackground(Color.RED);

    score1.setLocation(0, 100);
    score2.setLocation(700, 100);

    frame.add(score1);

    for (int i = 0; i < button.length / 2; i++) {
        button[i].setBounds(100 * (i + 1), 100, 100, 100);
        button[i].setBackground(Color.GRAY);
        buttonpanel.add(button[i]);
    }

    frame.add(buttonpanel);

    frame.add(score2);

    // frame.add(panel);
}

它只是给我一个完全蓝色的窗口。

1 个答案:

答案 0 :(得分:3)

你看到所有的蓝色是因为你要将score1,一个全蓝色的JTextArea添加到JFrame的contentPane,一个使用BorderLayout的容器,这使得JTextArea填充了contentPane,只留下蓝色。没有添加任何其他内容,因为NullPointerException是由您使用填充了null的JButton数组引起的。一旦你修复了这个bug(你从未告诉过我们),你就会看到因为同样的问题而只有红色。

您无疑会阅读的最佳解决方案是使用布局管理器来创建GUI。虽然null布局和setBounds()似乎可以像创建复杂GUI的最简单和最好的方式一样使用Swing GUI,但是您创建的Swing GUI越多,在使用它们时就会遇到更严重的困难。当GUI调整大小时,它们不会调整组件的大小,它们是增强或维护的皇室女巫,当它们被放置在滚动窗格中时它们完全失败,当它们在所有平台上观看时或者与原始平台不同的屏幕分辨率时它们看起来很糟糕

其他问题:

  • 您在JFrame 之前调用setVisible(true) 向其添加任何向后的内容。您希望在添加完所有内容后进行此次调用,以便在显示时显示在JFrame中。
  • 您正在设置JTextArea的布局,这是没有意义的,因为您永远不会将这些作为其他组件的容器使用。
  • 还要明白,这不符合您的想法:JTextArea(100, 200);。你不是创建一个100乘200像素的JTextArea,而是创建100个乘200 ,这是一个非常巨大的JTextArea。在使用不熟悉的组件时,您需要阅读文档和API。
  • 您说,"So I've been looking at other solutions to this problem, but it seems that none of them help at all."可能“其他解决方案”建议您使用布局管理器,而不是说它们根本没有“帮助”,您应该努力学习如何使用这些工具,因为其他解决方案 正确。
  • 是的,你正在尝试在尚未创建的JButton数组中使用JButton。理解一个引用类型的数组,比如JButton数组最初只用空引用填充,类似于一个空的纸盒。就像你不能使用纸箱中的任何鸡蛋,直到你把鸡蛋放在那里,你不能在你的阵列放置之前使用阵列中的JButtons。在迭代数组的for循环中,在顶行创建每个JButton项:button[i] = new JButton("Something");

您可以在此处找到指向Swing教程和其他Swing资源的链接:Swing Info

例如,您告诉我哪个更容易调试,您的代码或此代码:

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

public class Foo2 extends JPanel {
   private static final String[] BUTTON_TEXTS = { "A", "B", "C", "D", "E", "F",
         "G", "H", "I", "J", "K", "l" };
   private static final int GAP = 3;
   private JTextArea textArea1 = new JTextArea(20, 30);
   private JTextArea textArea2 = new JTextArea(20, 30);

   public Foo2() {
      JPanel textAreaGrid = new JPanel(new GridLayout(1, 0, GAP, GAP)); // gridlayout 1 row
      textAreaGrid.add(new JScrollPane(textArea1));
      textAreaGrid.add(new JScrollPane(textArea2));

      JPanel buttonPanel = new JPanel(new GridLayout(2, 0, GAP, GAP)); // 2 rows
      for (String btnText : BUTTON_TEXTS) {
         buttonPanel.add(new JButton(btnText));
      }

      setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
      setLayout(new BorderLayout(GAP, GAP)); // main GUI uses border layout
      add(textAreaGrid, BorderLayout.CENTER);
      add(buttonPanel, BorderLayout.PAGE_END);
   }

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

      JFrame frame = new JFrame("Foo2");
      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