簡體   English   中英

帶有網格布局和JButton的JPanel無法加載/工作

[英]JPanel with Grid Layout and JButtons doesn't load / work

我在讓BorderPad內部的JPanel正常工作時遇到麻煩。 我將面板的布局定義為網格布局,然后將我之前制作的一堆按鈕添加到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

您的主要問題:

  • 將組件添加到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();
         }
      });
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM