【问题标题】:Button background not changing按钮背景没有改变
【发布时间】:2015-07-15 19:25:29
【问题描述】:

我正在尝试制作一个黑白棋 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);


    }
}

【问题讨论】:

  • 也许我遗漏了一些明显的东西,但我不知道上面的代码块应该做什么,它的位置,或者它与你的问题有什么关系。考虑发布更多信息和相关代码,但在这样做之前,请从我们的角度考虑您的问题:不知道您的大部分程序是什么样子的人。
  • 刚刚添加了完整的代码,感谢您的帮助。

标签: java swing colors background jbutton


【解决方案1】:

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

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

首先创建Reversi 的单个实例作为类的实例字段。当一些状态改变事件发生时,使用这个实例来决定应该如何更新 UI 或模型

【讨论】:

    【解决方案2】:

    我不知道您打算在执行流程的哪个部分更改按钮的背景颜色,但乍一看,您的代码看起来是正确的。因为 setBackground color 方法完全按照它的说明进行操作。

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

    还要确保组件isOpaque 属性设置为true。 (设置思想 public void setOpaque(boolean isOpaque) mutator 方法)。有时这可能是问题所在。

    希望对你有帮助!

    【讨论】:

    • 是的,我正在尝试在单击按钮时更改按钮的颜色并且它符合标准。所有按钮一开始都设置为不透明。
    • 你的意思是像用户如何使用“butArray[l][y].setOpaque(true)”来初始化第二个代码sn-p中的按钮?
    猜你喜欢
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多