按钮背景不变

时间:2015-05-05 21:27:28

标签: java swing colors background jbutton

我正在尝试制作一个reversi GUI,我正在尝试使用if循环更改按钮颜色。但是,当它在此代码上运行时,它不会改变颜色:

if(y.board[i][j - 1] == 2)
{
    y.board[i][j] = 1;
    butArray[i][j].setBackground(Color.yellow);
    y.board[i][j - 1] = 1;
    butArray[i][j - 1].setBackground(Color.yellow);
    System.out.println("4");
}

这是我的JButton声明部分

for(l=0; l < butArray.length; l++)
{
    for(y=0; y <butArray[l].length; y++)
    {
        butArray[l][y] = new JButton("Xg");
        butArray[l][y].addActionListener(this);
        butArray[l][y].setBackground(Color.white);;
        butArray[l][y].setOpaque(true);
        buttons.add(butArray[l][y]);
    }
}

这是我的完整主要代码

/*
 * Jesse Richards
 * CMSC 112
 */

import java.awt.Color;
import java.util.Scanner;

public class Reversi {
    int playerturn;
    int counter;
    int[][] board = new int[8][8];
    Scanner keyboard = new Scanner(System.in);
    int playerOnePoints;
    int playerTwoPoints;


//getting things set
public void setplayerturn(){
        int i;

    if (counter % 2 == 0){
        playerturn = 1;
    }
    else{
        playerturn = 2;
    }
}
//setting arrays
public void setArrays(){
    int i;
    int j;
    for(i = 0;i<8;i++){
        for(j = 0;j<8;j++){
        board[i][j] = 0;

        }
    }

}

//gets what player is going



public void printBoard(){
    int i,j;
    for(i = 0;i<8;i++){
        for(j = 0;j<8;j++){

            System.out.print(board[i][j]);
            System.out.print(" ");
        }
        System.out.println("");
    }


}




public void points(){
    int i,j;
    for(i = 0;i<8;i++){
        for(j = 0;j<8;j++){
            if(board[i][j] == 1){
                playerOnePoints++;
            }
            else{
                playerTwoPoints++;
            }
        }
    }
}

}

和完整的主要驱动程序

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JMenuBar;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Color;


public class ReversiDriver extends JFrame implements ActionListener {

    private JPanel score;
    private JPanel buttons;
    JButton[][] butArray = new JButton[8][8];

    public static void main(String[] args) {
        ReversiDriver gui = new ReversiDriver();
        gui.setVisible(true);


        // TODO Auto-generated method stub
        Reversi x = new Reversi();
        int i;
        x.setplayerturn();
        x.setArrays();



//      for(i = 0;i<64;i++){
//          
//          
//          x.printBoard();
//          
//          x.counter++;
//          
//          
//          System.out.println("");
//      }


        x.points();
        System.out.println("Player one has " + x.playerOnePoints +" Points");
        System.out.println("Player two has " + x.playerTwoPoints +" Points");

        if(x.playerOnePoints>x.playerTwoPoints){
            System.out.println("Player One Wins!");

        }   else {
            System.out.println("Player Two Wins!");
            }
        }

    @Override
    public void actionPerformed(ActionEvent e) {

        System.out.println("BUG");
        //importing methods
        Reversi x = new Reversi();
        int i;
        int j;
        int l,y;
        // TODO Auto-generated method stub
        //if-else
        //e.getSource() --> return the name of button

        for(l=0; l < butArray.length; l++){
            for(y=0; y <butArray[l].length; y++){
                if(e.getSource() == butArray[l][y]){
                    //button was clicked1
                    playerOneTurn(l,y);

                }
            }
        }

        //e.getactionCommand()

        String but = e.getActionCommand();

    }
    public boolean playerOneTurn(int i, int j){
        int x;

        Reversi y = new Reversi();

        y.board[3][3] = 1;
        y.board[3][4] = 2;
        y.board[4][3] = 2;
        y.board[4][4] = 1;

        if(y.board[i - 1][j] == 0){
            y.board[i][j] = 1;
            butArray[i][j].setBackground(Color.yellow);
            y.board[i -1][j] = 1;
            butArray[i - 1][j].setBackground(Color.yellow);
            System.out.println("1");
        }
        if(y.board[i + 1][j] == 2){
            y.board[i][j] = 1;
            butArray[i][j].setBackground(Color.yellow);
            y.board[i + 1][j] = 1;
            butArray[i + 1][j].setBackground(Color.yellow);
            System.out.println("2");
        }
        if(y.board[i][j + 1] == 2){
            y.board[i][j] = 1;
            butArray[i][j].setBackground(Color.yellow);
            y.board[i][j + 1] = 1;
            butArray[i][j + 1].setBackground(Color.yellow);
            System.out.println("3");
        }
        if(y.board[i][j - 1] == 2){
            y.board[i][j] = 1;
            butArray[i][j].setBackground(Color.yellow);
            y.board[i][j - 1] = 1;
            butArray[i][j - 1].setBackground(Color.yellow);
            System.out.println("4");
        }

        if(y.board[i][j - 1] == 2){
            y.board[i][j] = 1;
            butArray[i][j].setBackground(Color.yellow);
            y.board[i][j - 1] = 1;
        butArray[i][j - 1].setBackground(Color.yellow);
            System.out.println("5");
        }
        System.out.println("JEse");

        return false;

    }
    public ReversiDriver(){
        super("Menu Demonstration");
        setSize(400, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new GridLayout(2, 2));

        score = new JPanel();
        score.setBackground(Color.black);
        add(score,BorderLayout.SOUTH);

        buttons = new JPanel();
        add(buttons, BorderLayout.NORTH);



        int y;
        int l;

        //arrange buttons
        for(l=0; l < butArray.length; l++){
            for(y=0; y <butArray[l].length; y++){
                butArray[l][y] = new JButton("Xg");
                butArray[l][y].addActionListener(this);
                butArray[l][y].setBackground(Color.white);;
                butArray[l][y].setOpaque(true);
                buttons.add(butArray[l][y]);
            }
        }

        //set four start buttons
        butArray[3][3].setBackground(Color.yellow);
        butArray[3][4].setBackground(Color.blue);
        butArray[4][3].setBackground(Color.blue);
        butArray[4][4].setBackground(Color.yellow);


    }
}

2 个答案:

答案 0 :(得分:3)

您正在创建ReversiReversi x = new Reversi()的多个实例,这意味着当您检查游戏状态时,它始终处于默认状态。

您似乎对控制台(线性)和基于GUI(事件驱动)程序的工作方式的不同感到困惑。

首先创建Reversi的单个实例作为班级的实例字段。发生某些状态更改事件时,请使用此实例确定应如何更新UI或模型

答案 1 :(得分:0)

我不知道您打算在哪个部分执行流程中更改按钮的背景颜色,但乍一看,您的代码看起来是正确的...因为方法setBackground颜色完全符合它的状态。

您是否尝试在组件的任何类型的侦听器的回调中设置背景(使用事件调度线程)?或者你正在设置另一个线程?

还要确保组件=SUMPRODUCT((MONTH($A$9:$A$50)=5)*ISNUMBER($B$9:$H$50),$B$9:$H$50)属性设置为true。 (设置思想public void isOpaque mutator方法)。有时这可能是问题。

希望它有所帮助!