Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java Swing为Reversi GUI创建游戏片段_Java_Swing_User Interface_Reversi - Fatal编程技术网

使用Java Swing为Reversi GUI创建游戏片段

使用Java Swing为Reversi GUI创建游戏片段,java,swing,user-interface,reversi,Java,Swing,User Interface,Reversi,我为Reversi创建了一个基本的GUI,使用JPanels在GridLayout中表示电路板。在演奏一首乐曲时,被点击的方块会改变颜色。我一直想换一块圆形的,背景保持不变 我到处找了不少,但似乎找不到一个方法来做这件事 --编辑-- 构造函数的代码。当播放一首曲子时,鼠标侦听器只是更新棋盘 Public boardGUI(int num){ game = new reversiGame(num, false); Dimension boardSize = new Dimens

我为Reversi创建了一个基本的GUI,使用JPanels在GridLayout中表示电路板。在演奏一首乐曲时,被点击的方块会改变颜色。我一直想换一块圆形的,背景保持不变

我到处找了不少,但似乎找不到一个方法来做这件事

--编辑--

构造函数的代码。当播放一首曲子时,鼠标侦听器只是更新棋盘

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);
        }
     }  
}
publicboardgui(int-num){
game=新的reversiGame(num,false);
尺寸板尺寸=新尺寸(600600);
numSquares=num;
layeredPane=新的JLayeredPane();
getContentPane().add(layeredPane);
layeredPane.setPreferredSize(boardSize);
layeredPane.addMouseListener(此);
board=新JPanel();
layeredPane.add(board,JLayeredPane.DEFAULT_LAYER);
board.setLayout(新网格布局(numSquares,numSquares));
board.setPreferredSize(boardSize);
board.setBounds(0,0,boardSize.width,boardSize.height);
对于(int i=0;i<(numSquares*numSquares);i++){
JPanel square=newjpanel(newborderlayout());
square.setboorder(BorderFactory.createLineBorder(Color.black));
正方形。背景(颜色。绿色);
板。添加(方形);
int行=(i/numSquares);
整数列=(i%numSquares);
如果((行+1==numSquares/2和列+1==numSquares/2)| |行==numSquares/2和列==numSquares/2){
方形.立根背景(颜色.白色);
}
如果((行+1==numSquares/2&col==numSquares/2)| |行==numSquares/2&col+1==numSquares/2){
方形。立根背景(颜色。黑色);
}
}  
}
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);
            }



        }
    }

}
public void updateBoard(){
int x=0;
int y=0;
ImageIcon black=新的ImageIcon(“Images/large black sphere.ico”);
ImageIcon白色=新的ImageIcon(“Images/large white sphere.ico”);
对于(int i=0;i
将JLabel添加到游戏板上的每个网格中。然后,您可以使用图标来表示reversi部件。然后,当您想要更改reversi部件时,您可以更改标签的图标

这里的棋盘示例:展示了如何实现这一点

…使用
图像图标
,但当我运行它时,它不会显示

您可能需要调用
repaint()
<中的代码>彩色图标就是一个例子


仔细看,您的
updateBoard()
方法似乎在向现有面板添加新标签,而不删除旧标签或验证面板的布局。相反,请就地更新
图标。

向我们显示您正在使用的代码,或者可以帮助我们解决问题的内容。这里没有足够的信息。一种方法是在JPanel或其他JComponent的paintComponent方法中简单地绘制或不绘制椭圆形。关键点是将游戏逻辑与游戏GUI分开,并使用逻辑或模型作为决定在何处绘制圆圈的基础。我更改了GUI中的updateBoard函数,添加了使用ImageIcon构建的JLabel,但当我运行它时,它不会显示出来。有什么想法吗?@CNevin561,那么你的代码和我的代码有何不同?我发布了一个完整的工作示例。我建议您更改图标,而不是创建新标签。