Проблема с макетом Java - PullRequest
3 голосов
/ 28 июня 2011

У меня есть 3 класса в моей программе.

public class Field extends JLabel{

    private int x, y;

    public Field(int x, int y){
        this.x = x;
        this.y = y;
        setOpaque(true);
        setMinimumSize(new Dimension(50,50));
        setPreferredSize(new Dimension(75,75));
        if((x + y) % 2 == 0)
            setBackground(Color.GREEN);
        else
            setBackground(Color.YELLOW);
    }


public class Board extends JPanel{

    public Field[][] fields = new Field[8][8];

    public Board(){
        setLayout(new GridLayout(8,8));
        setMinimumSize(new Dimension(500,500));
        setPreferredSize(new Dimension(550,550));
        setBackground(Color.RED);
        fillBoard();
    }

    private void fillBoard(){
        for(int i = 0; i < 8; ++i){
            for(int j = 0; j < 8; ++j){
                fields[i][j] = new Field(i, j);
                add(fields[i][j]);
            }
        }
    }

public class GUI extends JFrame{

    public Board board;

    private GUI(){
        board = new Board();
        setLayout(new FlowLayout());
        add(board);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        pack();
    }

    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                new GUI();
            }
        });
    }

}

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

Ответы [ 2 ]

3 голосов
/ 28 июня 2011

Ваш опубликованный код не компилируется.Перерасчет на вложенные классы позволил ему работать правильно , как показано, поэтому я предполагаю, что у вас есть проблемы на уровне проекта.

0 голосов
/ 28 июня 2011

Вы должны установить менеджер макета и добавить компонент в contentPane на JFrame, внутри GUI вы должны вызвать:

getContentPane().setLayout(new FlowLayout());
getContentPane().add(board);

Ваш код компилируется, если Board и Field реорганизованы во внутренние классы, но результат выглядит следующим образом Result

Чтобы интерфейс выглядел без красной строки комментария setPreferredSize(new Dimension(550,550)); к вашему конструктору Board, чтобы он стал:

public Board(){
        int rows = 8,cols = 8;
    setLayout(new GridLayout(rows,cols));
    setMinimumSize(new Dimension(500,500));
    //setPreferredSize(new Dimension(550,550));
    setBackground(Color.RED);
    fillBoard();
}

The result after removing setPreferredSize()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...