简体   繁体   中英

Button background not changing

I am trying to make a reversi GUI and I am trying to change the buttons colors with an if loop. However, when it runs over this code it doesn't change the color:

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

This is my JButton declaring part

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

Here is my full main code

/*
 * 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++;
            }
        }
    }
}

}

and full main driver

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


    }
}

You're creating multiple instances of Reversi , Reversi x = new Reversi() , which means that when you inspect the state of the game, it's always at its default state.

You seem to be confused over the difference of how a console (linear) and GUI based (event driven) program works.

Start by creating a single instance of your Reversi as an instance field of your class. When some state change event occurs, use this instance to determine how the UI or model should be updated

I do not know in what part of the execution flow you intend to change the background color of a button, but at first sight, you code looks correct.. because the method setBackground color do exactly what it states.

Are you trying to set the background in a callback of any kind of listener of a component (Using the Event Dispatch Thread) ? or you are setting in another thread?

Also be sure that the component isOpaque property is set to true. (set thought public void setOpaque(boolean isOpaque) mutator method). Sometimes this can be the problem.

Hope it helps!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM