簡體   English   中英

JPanel不顯示在JFrame中

[英]JPanel not displaying in JFrame

我知道已經問過多次相同的問題,但是我似乎並沒有在代碼中找到阻礙JPanel類型的對象顯示在JFrame中的錯誤。 這是擴展JFrame的類的構造函數:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;


public class Game extends JFrame implements ActionListener {

  private static final long serialVersionUID = 1L;

  private Board board;

  public Game() {
    super("Game");

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBackground(Color.WHITE);

    board = new Board();
    add(board, BorderLayout.CENTER);

    JButton button = new JButton("Start new game");
    button.setFocusPainted(false);
    button.addActionListener(this);

    JPanel control = new JPanel();
    control.setBackground(Color.WHITE);
    control.add(button);
    add(control, BorderLayout.SOUTH);

    pack();
    setResizable(false);
    setVisible(true);   
  }

這是擴展JPanel的類的構造函數:

public class Board extends JPanel implements ActionListener {

  public Board() {
    setBackground(Color.WHITE);
    setLayout(new GridLayout(NUMBER_OF_ROWS, NUMBER_OF_COLUMNS));
    setBorder(BorderFactory.createEmptyBorder(20, 20, 0, 20));
    board = new Cell[NUMBER_OF_ROWS][NUMBER_OF_COLUMNS];

    for (int row = 0; row < NUMBER_OF_ROWS; row++) {
      for (int column = 0; column < NUMBER_OF_COLUMNS; column++) {
        board[row][column] = new Cell(this, row, column);
        add(board[row][column]);
      }
    }
  }

當我運行main方法(在此未顯示)時,它僅顯示框架和按鈕。 如果有人可以對此提供提示,我將非常感謝。

在此可運行代碼的相似變體( MCTaRE )中,似乎顯示得很好。

在此處輸入圖片說明

請注意,我在GridLayout放置了一些空間,並更改了顏色以使面板邊界更加清晰。

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

public class Game extends JFrame {

    private static final long serialVersionUID = 1L;
    private Board board;

    public Game() {
        super("Game");

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBackground(Color.WHITE);

        board = new Board();
        add(board, BorderLayout.CENTER);

        JButton button = new JButton("Start new game");
        button.setFocusPainted(false);

        JPanel control = new JPanel();
        control.setBackground(Color.GREEN);
        control.add(button);
        add(control, BorderLayout.SOUTH);

        pack();
        setResizable(false);
        setVisible(true);
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                new Game();
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency
        SwingUtilities.invokeLater(r);
    }
}

/** A pseudo Cell */
class Cell extends JButton {
    Cell(JComponent parent, int row, int column) {
        super(row + " " + column);
    }
}

/** And this one is the constructor of the class that extends JPanel */
class Board extends JPanel {

    int NUMBER_OF_ROWS=3;
    int NUMBER_OF_COLUMNS=4;
    Cell[][] board;

    public Board() {
        setBackground(Color.RED);
        setLayout(new GridLayout(NUMBER_OF_ROWS, NUMBER_OF_COLUMNS, 5, 5));
        setBorder(BorderFactory.createEmptyBorder(20, 20, 0, 20));
        board = new Cell[NUMBER_OF_ROWS][NUMBER_OF_COLUMNS];

        for (int row = 0; row < NUMBER_OF_ROWS; row++) {
            for (int column = 0; column < NUMBER_OF_COLUMNS; column++) {
                board[row][column] = new Cell(this, row, column);
                add(board[row][column]);
            }
        }
    }
}

暫無
暫無

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

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