2

JPanels を使用して GridLayout でボードを表すリバーシの基本的な GUI を作成しました。ピースが再生された瞬間に、クリックされた四角の色が変わります。変更する代わりに円形のピースを取得しようとしており、背景は同じままです。

かなり調べましたが、これを行う方法が見つからないようですか?

- 編集 -

コンストラクターのコード。ピースが再生されると、Mouse リスナーがボードを更新するだけです

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);
        }
     }  
}

updateBoard 関数

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);
            }



        }
    }

}
4

2 に答える 2

2

ゲームボードの各グリッドにJLabelを追加します。次に、アイコンを使用してリバーシピースを表すことができます。次に、リバーシピースを変更する場合は、ラベルのアイコンを変更します。

ここにあるチェスボードの例:カスタムSwingコンポーネントを表示するにはどうすればよいですか?これがどのように行われるかを示します。

于 2011-11-06T15:39:21.777 に答える
2

… を使用してImageIconいますが、実行しても表示されません。

呼び出す必要がある場合がありrepaint()ます。ColorIconMVCGame一例です。

よく見ると、updateBoard()このメソッドは、古いラベルを削除したり、パネルのレイアウトを検証したりせずに、既存のパネルに新しいラベルを追加しているように見えます。代わりに、その場で更新しIconてください。

于 2011-11-06T18:30:30.220 に答える