Создание игровой части для Reversi GUI с использованием Java Swing - PullRequest
2 голосов
/ 06 ноября 2011

Я создал базовый графический интерфейс для Реверси, используя JPanels для представления платы в GridLayout. В тот момент, когда играется фигура, щелкающий квадрат меняет цвет. Вместо этого я пытался заставить круговую фигуру измениться, а фон остался прежним.

Я довольно долго искал и не могу найти способ сделать это?

- Edit -

Код для конструктора. Когда пьеса воспроизводится, слушатель мыши просто обновляет доску

Public boardGUI(int num){

    game = new reversiGame(num, false);
    Dimension boardSize = new Dimension(600, 600);

    numSquares = num; 

    layeredPane = new JLayeredPane();
    getContentPane().add(layeredPane);
    layeredPane.setPreferredSize(boardSize);
    layeredPane.addMouseListener(this);

    board = new JPanel();
    layeredPane.add(board, JLayeredPane.DEFAULT_LAYER);

    board.setLayout( new GridLayout(numSquares, numSquares) );
    board.setPreferredSize( boardSize );
    board.setBounds(0, 0, boardSize.width, boardSize.height);

    for (int i = 0; i < (numSquares * numSquares); i++) {
        JPanel square = new JPanel( new BorderLayout() );
        square.setBorder(BorderFactory.createLineBorder(Color.black));
        square.setBackground(Color.green);
        board.add( square );

        int row = (i/numSquares);
        int col = (i % numSquares);

        if ((row + 1 == numSquares / 2 & col + 1 == numSquares/2) || row == numSquares/2 & col == numSquares/2){
            square.setBackground(Color.white);
        }

        if ((row + 1 == numSquares / 2 & col == numSquares/2) || row == numSquares/2 & col + 1 == numSquares/2){
            square.setBackground(Color.black);
        }
     }  
}

Функция updateBaord

public void updateBoard(){
    int x = 0;
    int y = 0;

    ImageIcon black = new ImageIcon("Images/large-black-sphere.ico");
    ImageIcon white = new ImageIcon("Images/large-white-sphere.ico");
    for(int i = 0; i < numSquares; i++){
        for(int j = 0; j < numSquares; j++){

            x = i * (600/numSquares);
            y = j * (600/numSquares);
            Component c =  board.findComponentAt(x, y);
            GridType g = game.getGridType(i, j);

            if (g.equals(GridType.WHITE)){
                JPanel temp = (JPanel) board.getComponent( i + j );
                piece = new JLabel(white);
                temp.add(piece);
                //c.setBackground(Color.white);
            }
            else if(g.equals(GridType.BLACK)){
                JPanel temp = (JPanel)board.getComponent( i + j );
                piece = new JLabel(black);
                temp.add(piece);
                //c.setBackground(Color.black);
            }
            else{
                //c.setBackground(Color.GREEN);
            }



        }
    }

}

Ответы [ 2 ]

2 голосов
/ 06 ноября 2011

… используя ImageIcon, хотя, когда я запускаю его, он не отображается.

Возможно, вам потребуется вызвать repaint();ColorIcon in MVCGame является примером.

Если присмотреться, ваш метод updateBoard() выглядит как добавление новой метки к существующей панели без удаления старой метки или проверкимакет панели.Вместо этого обновите Icon на месте.

2 голосов
/ 06 ноября 2011

Добавьте JLabel к каждой сетке на игровом поле. Затем вы можете использовать иконки для представления реверси. Затем, когда вы захотите изменить части реверси, вы измените значок метки.

Пример ChessBoard здесь: Как сделать видимым мой настраиваемый компонент Swing? показывает, как это можно сделать.

...