带有网格布局和JButton的JPanel无法加载/工作

时间:2014-04-15 02:56:42

标签: java swing jframe jpanel jbutton

我无法在BorderLayout中使用JPanel工作。 我将Panel的布局定义为网格布局,然后添加了一堆我手头制作的按钮到JPanel。但是,当我运行程序时,JFrame会加载,但框架内的任何内容都不会加载。这是代码:

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

public class Phone extends JFrame {
private JTextField PhoneText;
private JPanel ButtonPanel;
private JButton bttn1;
private JButton bttn2;
private JButton bttn3;
private JButton bttn4;
private JButton bttn5;
private JButton bttn6;
private JButton bttn7;
private JButton bttn8;
private JButton bttn9;
private JButton bttn10;
private JButton bttn11;
private JButton bttn12;

public Phone(){
    setTitle("Phone - Agustin Ferreira");
    Container ContentPane = getContentPane();
    ContentPane.setLayout(new BorderLayout());
    setSize(300, 400);
    setVisible(true);
    setBackground(Color.DARK_GRAY);
    PhoneText = new JTextField("(317)188-8566");
    bttn1 = new JButton ("1");
    bttn2 = new JButton ("2");
    bttn3 = new JButton ("3");
    bttn4 = new JButton ("4");
    bttn5 = new JButton ("5");
    bttn6 = new JButton ("6");
    bttn7 = new JButton ("7");
    bttn8 = new JButton ("8");
    bttn9 = new JButton ("9");
    bttn10 = new JButton ("*");
    bttn11 = new JButton ("0");
    bttn12 = new JButton ("#");
    ButtonPanel = new JPanel(new GridLayout(4,3,0,0));

    ButtonPanel.add(bttn1);
    ButtonPanel.add(bttn2);
    ButtonPanel.add(bttn3);
    ButtonPanel.add(bttn4);
    ButtonPanel.add(bttn5);
    ButtonPanel.add(bttn6);
    ButtonPanel.add(bttn7);
    ButtonPanel.add(bttn8);
    ButtonPanel.add(bttn9);
    ButtonPanel.add(bttn10);
    ButtonPanel.add(bttn11);
    ButtonPanel.add(bttn12);
    ContentPane.add(PhoneText, BorderLayout.NORTH);
    ContentPane.add(ButtonPanel, BorderLayout.CENTER);
}

}

另外,我有另一个调用Phone类的类。这是代码,以防万一:

package ProgrammingAssignment11;

import javax.swing.JFrame;

public class GUI_Driver {

public static void main(String[] args) {
    Phone Nokia;
    Nokia = new Phone();
    Nokia.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}

}

任何帮助?

非常感谢,M3tal T1ger

1 个答案:

答案 0 :(得分:2)

你的主要问题:

  • 只有在 向GUI中添加组件后才能调用setVisible(true) 。你没有这样做,因此没有组件就会绘制GUI。

此外:

  • 您应该避免设置任何尺寸或首选尺寸。而是让组件和布局管理器自己调整大小。
  • 在添加所有组件之后,在使GUI可见之前,不要忘记调用pack()
  • 学习并遵循Java命名约定,包括给出以小写字母开头的所有变量和方法名称,以及名称以大写字母开头的所有类。

例如:

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;

import javax.swing.*;

@SuppressWarnings("serial")
public class Phone2 extends JPanel {
   private static final String[][] BTN_TEXTS = {
      {"1", "2", "3"},
      {"4", "5", "6"},
      {"7", "8", "9"},
      {"*", "0", "#"}
   };
   private static final float BTN_POINTS = 48f;
   private static final float TEXT_POINTS = 24f;
   private static final int DISPLAY_COLUMNS = 12;

   private JButton[][] buttons = new JButton[BTN_TEXTS.length][BTN_TEXTS[0].length];
   private JTextField display = new JTextField(DISPLAY_COLUMNS);

   public Phone2() {
      display.setFocusable(false);
      display.setFont(display.getFont().deriveFont(TEXT_POINTS));
      GridLayout gridLayout = new GridLayout(BTN_TEXTS.length, BTN_TEXTS[0].length);
      JPanel btnPanel = new JPanel(gridLayout);
      for (int i = 0; i < BTN_TEXTS.length; i++) {
         for (int j = 0; j < BTN_TEXTS[i].length; j++) {
            String text = BTN_TEXTS[i][j];
            JButton btn = new JButton(new BtnAction(text));
            btn.setFont(btn.getFont().deriveFont(Font.BOLD, BTN_POINTS));
            btnPanel.add(btn);
            buttons[i][j] = btn;
         }
      }

      setLayout(new BorderLayout());
      add(display, BorderLayout.NORTH);
      add(btnPanel, BorderLayout.CENTER);
   }

   private class BtnAction extends AbstractAction {
      public BtnAction(String name) {
         super(name);
      }

      @Override
      public void actionPerformed(ActionEvent evt) {
         String text = evt.getActionCommand();
         display.setText(display.getText() + text);
      }
   }

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

      JFrame frame = new JFrame("Phone");
      frame.setDefaultCloseOperation(JFrame.EXIT_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();
         }
      });
   }
}