java - 将递增/变化的字符串值转换为 JButtons 的现有增量变量名称,以修改其在 java 中的属性

标签 java swing jbutton string-conversion

简化:How to make String value to call specific existed JButton variable name in java?

我正在尝试制作一款非普通的 Tic-Tac-Toe 游戏...

无论如何,我在这里发布的并不是整个概念。我只是想让它变得简单:我有 9 个名为(3 x 3)的方形 jButton(并且可能允许用户通过将来的设置制作 4x4、5x5、10x10 等):

[markbox_00_00] / [markbox_00_01] / [markbox_00_02]

[markbox_01_00] / [markbox_01_01] / [markbox_01_02]

[markbox_02_00] / [markbox_02_01] / [markbox_02_02]

[btnSave] / [btnUndoActions]

其中前两位数字代表行,接下来的两位数字代表列;以及保存按钮 (btnSave) 和撤消按钮 (btnUndoActions)。

每个标记框的默认 Spring 值为“0”,当我单击时它会变成“1”;当我点击“1”时,它变成“0”。当您按下撤消按钮时,它将重置为上次保存的状态。

这是我的一些简化的代码行:

private byte markboxColLimit = 3, markboxRowLimit = 3, row, col;
private byte[][] saveNumber = new byte[markboxRowLimit][markboxColLimit];
private String buttonName;

public Astral_TicTacToe() {
initComponents();

    /* I want something like this, but using a for loop based on markboxColLimit and 
    markboxRowLimit as limits */

    markbox_00_00.setText("0");
    markbox_00_01.setText("0");
    markbox_00_02.setText("0");
    markbox_01_00.setText("0");
    markbox_01_01.setText("0");
    markbox_01_02.setText("0");
    markbox_02_00.setText("0");
    markbox_02_01.setText("0");
    markbox_02_02.setText("0");

          /* I know the line below is wrong... what I'm trying is to avoid
           * repetitiveness by looping and dynamically calling the variable
           * name of JButtons, or in other ways...
           */
    /* Attempting to make an alternative code from above (trying to make a loop instead) */

    for(row = 0; row < markboxRowLimit; row++){

        for(col = 0; col < markboxColLimit; col++){
          buttonName = "markbox_0" + Byte.toString(row) + "_0" + Byte.toString(col);

          buttonName.setText("0");
        }
    }
}

private void btnUndoActionsActionPerformed(java.awt.event.ActionEvent evt) {

    markbox_00_00.setText(Byte.toString(saveNumber[0][0]));
    markbox_00_01.setText(Byte.toString(saveNumber[0][1]));
    markbox_00_02.setText(Byte.toString(saveNumber[0][2]));
    markbox_01_00.setText(Byte.toString(saveNumber[1][0]));
    markbox_01_01.setText(Byte.toString(saveNumber[1][1]));
    markbox_01_02.setText(Byte.toString(saveNumber[1][2]));
    markbox_02_00.setText(Byte.toString(saveNumber[2][0]));
    markbox_02_01.setText(Byte.toString(saveNumber[2][1]));
    markbox_02_02.setText(Byte.toString(saveNumber[2][2]));
}

private void btnSaveActionPerformed(java.awt.event.ActionEvent evt) {
    saveNumber[0][0] = Byte.parseByte(markbox_00_00.getText());
    saveNumber[0][1] = Byte.parseByte(markbox_00_01.getText());
    saveNumber[0][2] = Byte.parseByte(markbox_00_02.getText());
    saveNumber[1][0] = Byte.parseByte(markbox_01_00.getText());
    saveNumber[1][1] = Byte.parseByte(markbox_01_01.getText());
    saveNumber[1][2] = Byte.parseByte(markbox_01_00.getText());
    saveNumber[2][0] = Byte.parseByte(markbox_02_00.getText());
    saveNumber[2][1] = Byte.parseByte(markbox_02_01.getText());
    saveNumber[2][2] = Byte.parseByte(markbox_02_02.getText());
}

private void markbox_00_00ActionPerformed(java.awt.event.ActionEvent evt) {
    if("0".equals(markbox_00_00.getText()))
        markbox_00_00.setText("1");
    else
        markbox_00_00.setText("0");
}

private void markbox_00_01ActionPerformed(java.awt.event.ActionEvent evt) {
    if("0".equals(markbox_00_01.getText()))
        markbox_00_00.setText("1");
    else
        markbox_00_00.setText("0");
}

....

private void markbox_02_02ActionPerformed(java.awt.event.ActionEvent evt) {
    if("0".equals(markbox_00_00.getText()))
        markbox_02_02.setText("1");
    else
        markbox_02_02.setText("0");
}

简而言之:如何使 String 成为 JButton 的特定变量名称,以便调用/访问/编辑其属性?

示例:

按钮名称 = markbox_01_02;

buttonName.setText("2");

is equavalent to markbox_01_02.getText("2");

非常感谢您的帮助,谢谢...

附注我习惯在 NetBeans Design 中制作 JFrame(只需单击并拖动调色板窗口中的对象,如 JPanel、JButton 等,因此除了制作自己的逻辑方法外,我不会手动键入代码)。

最佳答案

您可能需要重做您的程序并重新表述您的问题,因为不太清楚您被困在哪里,这就是我将此答案写为社区 Wiki 的原因。

以下程序创建 GridLayout并在其下方添加 2 个 JButton,其中包含“保存”和“撤消”按钮。

每当您按下按钮时,它都会根据按钮之前的状态将其文本更改为 01,并且“撤消”按钮将撤消上次单击的内容同样,如果它是 0,它将变成 1,反之亦然。

我想你应该阅读How to write an ActionListener在复制粘贴此示例之前,请先了解其含义并尝试了解此程序的工作原理。

“保存”按钮的逻辑取决于您,因为我不确定您想在那里做什么,而且我不会为您编写所有代码。这样做只是为了让您了解如何处理事件。

此外,出于与“保存”按钮相同的原因,结束游戏的逻辑留给您。

我希望知道如何在 Ubuntu 中录制屏幕并保存为 GIF,但这里有一个关于该程序的屏幕截图:

enter image description here

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class TicTacToe implements ActionListener {
    JFrame frame;
    JButton buttons[];
    JPanel pane, buttonPane;
    boolean pressed[];
    JButton save, undo;
    int n = -1;

    public void actionPerformed(ActionEvent e) {
        for (int i = 0; i < buttons.length; i++) {
            if(e.getSource() == buttons[i]) {
                pressed[i] = !pressed[i];
                buttons[i].setText(pressed[i] ? "1" : "0");
                n = i;
                break;
            }
        }
    }

    public TicTacToe () {
        frame = new JFrame("Tic Tac Toe Game");
        buttons = new JButton[9];
        pane = new JPanel(new GridLayout(3, 3));
        pressed = new boolean[9];
        buttonPane = new JPanel(new FlowLayout());
        save = new JButton("Save");
        undo = new JButton("Undo");

        for (int i = 0; i < buttons.length; i++) {
            buttons[i] = new JButton("0");
            pressed[i] = false;
        }

        for (JButton b : buttons) {
            b.addActionListener(this);
            pane.add(b);
        }

        undo.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                if (n == -1) {
                    return;
                }
                pressed[n] = !pressed[n];
                buttons[n].setText(pressed[n] ? "1" : "0");
            }
        });

        buttonPane.add(save);
        buttonPane.add(undo);

        frame.add(pane, BorderLayout.PAGE_START);
        frame.add(buttonPane, BorderLayout.CENTER);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
    public static void main (String args[]) {
        new TicTacToe();
    }
}

关于java - 将递增/变化的字符串值转换为 JButtons 的现有增量变量名称,以修改其在 java 中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34617167/

相关文章:

java - JFrame 中的按钮,访问 AbstractTableModel 中的方法

java - 如何让 Java 程序暂停,直到按下特定按钮?

java - 在 java 中使用带有覆盖方法的 throws 子句时出错?

java - 如果我有一个扩展 <AsyncTask> 类的单独类,如何从 onPostExecute() 获取值?

java - JOptionPane。程序不显示错误信息

java - BorderLayout 不支持最大尺寸

java - 自动将流量迁移到最新的 Google 应用引擎版本

java - 在 JAVA 列表中为最后一个值附加一个字符

java - JTable 单元格重叠

java - 如何在java中一行创建一个自存在的按钮?