Java Swing、 Action 监听器

标签 java swing actionlistener

我正在编写简单的扫雷游戏。我使用了2个二维数组,第一个是保存JButton的,第二个数组里面是否有炸弹。

JButton[][] tab = new JButton[8][8];
int[][] mine = new int[8][8];

在 ActionLister 中,我检查实际单击了哪个按钮以及内部是否有炸弹。

public void actionPerformed(ActionEvent e) {
    if(e.getSource()==tab[0][0] && mine[0][0]==9) {
        tab[0][0].setText("B");
        tab[0][0].setEnabled(false);
    }
    if(e.getSource()==tab[0][1] && mine[0][1]==9) {
        tab[0][1].setText("B");
        tab[0][1].setEnabled(false);
    }
    if(e.getSource()==tab[0][2] && mine[0][2]==9) {
        tab[0][2].setText("B");
        tab[0][2].setEnabled(false);
    }

9表示里面有炸弹。

我不想写这样的64行代码。我该如何改变这个?

最佳答案

由于我假设您使用的是 Java 8(或更高版本),因此这应该是最简单的解决方案:

//code to create buttons and to place them on the frame / panel
for(int y = 0; y < 8; y++){
    for(int x = 0; x < 8; x++){
        JButton b = new JButton();
        //place the JButton on your frame / panel
        //probably you are using a GridLayout
        b.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                if(mine[y][x] == 9){
                    b.setText("B");
                    b.setEnabled(false);
                }
            }
        });
    }
}

这样您就不必保存所有按钮,因为您可以从 ActionListener 内部访问按钮变量。

当您使用Java 7(或更早版本)时,您还必须将按钮变量声明为final

final JButton b = new JButton();

或者,您也可以将源强制转换为 JButton,以从操作监听器内部访问源组件

public void actionPerformed(ActionEvent e){
    JButton b = (JButton)e.getSource();
    b.setText("B");
    b.setEnabled(false);
}

关于Java Swing、 Action 监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49964651/

相关文章:

java - Spring AMQP中事务的用例

java - Java 中的输出流

java - 在存储文件中发生更新后,如何在java中自动刷新gui屏幕?

java - 局部变量是多余的

java - 如何部分更新/重新绘制 jpanel(背景内容不会再次绘制。它保持原样)

java - 如何在 Swing 中删除自动对焦

java - 将值从一个类传递到另一个类

java - 在 actionPerformed 完成之前禁用单击按钮 java

java - 从 GUI 代码外部请求用户输入,在这种情况下我是否需要事件或操作来与 GUI 进行通信?

java - Cassandra 用 Ja​​va 从文件中保存数据