2014-02-16 4 views
1

Я знаю, что один и тот же вопрос задавался много раз, но я действительно не вижу ошибки в моем коде, что препятствует тому, чтобы объект типа JPanel отображался в JFrame. Вот конструктор класса, который простирается JFrame:JPanel не отображается в 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]); 
     } 
    } 
    } 

Когда я запускаю основной метод (который я не сделал показать здесь), он показывает только рамку и кнопку. Если бы кто-то мог намекнуть на это, я был бы очень благодарен.

+0

Добавить основной метод. –

+0

public static void main (String [] args) { новый Game(); } – user3317143

+0

отнять макеты границы для доски и кнопки - они могут быть друг на друга – BruceWayne

ответ

0

Кажется, что это очень хорошо видно в этом близком варианте кода, который запускается (a MCTaRE).

enter image description here

Обратите внимание, что я положил некоторое пространство в 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]); 
      } 
     } 
    } 
} 
+0

Спасибо! Моя ошибка, вероятно, в конструкторе Ячейка. Опять же, спасибо за ваше время и помощь. – user3317143

+0

* «.. ошибка, вероятно, в конструкторе Ячейки». * Одна из многих веских причин подготовить и опубликовать MCTaRE. Обратите внимание, что класс «Ячейка» не включался в исходный код, я просто «подделывал его», используя «JButton». –

Смежные вопросы