在Java中使用不同类中的变量

时间:2014-12-28 20:21:15

标签: java

我不理解int a;主要是我在Action侦听器中调用了st。我希望每次点击一个cetain按钮时st减少1,但它似乎对每个按钮都有效。我做了它所以每当我按下另一个按钮来测试它时它会在按钮上写出来它只适用于第一个按钮然后它保持不变。 (我希望我有任何意义)

这是我的代码,Main class:

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Start {
public static int a;
public static JButton[][] gumbi = new JButton[15][15];

public static void main(String[] args) {
    JFrame okno = new JFrame("Nonogram");
    okno.setVisible(true);
    okno.setSize(700, 700);
    okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel panel = new JPanel(new BorderLayout());
    okno.add(panel);

    JPanel polje = new JPanel(new GridLayout(15, 15));
    panel.add(polje, BorderLayout.CENTER);
    a = 0;

    for (int i = 0; i < 15; i++) {
        for (int j = 0; j < 15; j++) {
            if (i < 5 && j < 5) {
                gumbi[i][j] = new JButton();
                gumbi[i][j].setBackground(Color.GREEN);
                // gumbi[i][j].addActionListener(new Listener(gumbi));
                polje.add(gumbi[i][j]);
            } else if (i < 5 || j < 5) {
                gumbi[i][j] = new JButton();
                gumbi[i][j].setBackground(Color.YELLOW);

                // gumbi[i][j].addActionListener(new Listener(gumbi));
                polje.add(gumbi[i][j]);
                gumbi[i][j].setEnabled(false);

            } else {
                if (Math.random() <= 0.6) {

                    gumbi[i][j] = new JButton();
                    gumbi[i][j].setBackground(Color.WHITE);
                    gumbi[i][j].addActionListener(new Listener(gumbi));
                    gumbi[i][j].setText("3");
                    polje.add(gumbi[i][j]);

                } else {
                    gumbi[i][j] = new JButton();
                    gumbi[i][j].setBackground(Color.WHITE);
                    gumbi[i][j].addActionListener(new Listener(gumbi));
                    gumbi[i][j].setText("4");
                    polje.add(gumbi[i][j]);
                }
            }
            if (gumbi[i][j].getText() == "3") {
                a += 1;
            }
            if (i == 14 && j == 14) {
                gumbi[i][j].setText("" + a);

            }
        }
    }


}
}

和ActionListener:

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

import javax.swing.JButton;


public class Listener implements ActionListener {
JButton[][] gumbi = Start.gumbi;
int st = Start.a;

public Listener(JButton[][] gumbi)  {
    this.gumbi = gumbi;

}

public void actionPerformed(ActionEvent e){

    JButton gumb = (JButton) e.getSource();

    if( gumb.getBackground() == Color.WHITE){
        gumb.setBackground(Color.BLACK);
    } else if (gumb.getBackground() == Color.BLACK){
        gumb.setBackground(Color.WHITE);
    }
    if( gumb.getBackground() == Color.WHITE && gumb.getText() == "3"){
        st -= 1;

    } else if (gumb.getBackground() == Color.BLACK && gumb.getText() == "3"){
        st += 1;
        gumbi[0][0].setText("" + st);
    }
}


}

2 个答案:

答案 0 :(得分:0)

问题在于您创建了静态变量(Start.a)的副本到实例变量(st),它将是每个动作侦听器实例的单独副本。

如果您确实需要在类级别维护该值,为什么不直接操作该值而不是保留副本。

if( gumb.getBackground() == Color.WHITE && gumb.getText() == "3"){
    Start.a -= 1;

} else if (gumb.getBackground() == Color.BLACK && gumb.getText() == "3"){
    Start.a += 1;
    gumbi[0][0].setText("" + st);
}

答案 1 :(得分:0)

你的行

int st = Start.a;

没有按照你的想法行事。它在创建实例时读取a的值,并将其值复制到新变量st中。更改st不会对a产生任何影响,因为您只是在更改副本;并且您为每个创建的实例获得了新副本。

尝试直接更改Start.a,而不是将其复制到新的st并进行更改。