Преобразуйте увеличивающееся/изменяющееся строковое значение в существующее имя возрастающей переменной JButtons, чтобы изменить их свойства в java.

Упрощенный: Как сделать строковое значение для вызова конкретного существующего имени переменной JButton в java?

Я пытаюсь сделать необычную игру в крестики-нолики...

В любом случае, то, что я опубликую здесь, на самом деле не является всей концепцией этого. Я просто хочу сделать это простым: у меня есть 9 квадратных jButtons с именами (3 на 3) (и, возможно, разрешить пользователю делать 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).

Каждое поле пометки имеет значение пружины по умолчанию «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;

имя_кнопки.setText("2");

эквивалентно markbox_01_02.getText("2");

Я очень ценю помощь, спасибо...

P.S. Я использую для создания JFrame в NetBeans Design (просто щелкните и перетащите объекты в окне палитры, такие как JPanel, JButton и т. д., поэтому я не набираю код вручную, а создаю свой собственный логический метод).


person Jan Jeremy    schedule 05.01.2016    source источник
comment
как преобразовать строку в JButton? какую строку?   -  person Frakcool    schedule 05.01.2016
comment
попробуйте перефразировать свой вопрос, так как непонятно, о чем вы спрашиваете. Более того, вам не нужно много методов ActionPerformed, достаточно одного.   -  person mxb    schedule 05.01.2016
comment
Я согласен с тем, что говорит @mxb - ваш вопрос совершенно неясен. Также вы захотите отделить логику вашей программы от вашего графического интерфейса. Создайте модель без графического интерфейса, которая содержит состояние сетки 3 на 3 объектов MarkBox, и при нажатии кнопки проверяйте состояние соответствующего объекта MarkBox и реагируйте в соответствии с его состоянием, включая изменение его состояния. После этого изменения состояния отразятся на внешнем виде графического интерфейса.   -  person Hovercraft Full Of Eels    schedule 05.01.2016
comment
Вероятно, вам нужны кнопки JButton[][], содержащие 3 ряда по 3 кнопки.   -  person JB Nizet    schedule 05.01.2016
comment
Я не уверен, что хорошо понимаю вашу проблему: вы хотите, чтобы ваша игра TicTacToe показывала 1 или 0 при нажатии любой кнопки. И когда вы щелкнете кнопку отмены, она отменит последний щелчок, я прав?   -  person Frakcool    schedule 05.01.2016
comment
Привет, извините за неясность. Что касается кнопки «Отменить», она действует как удаление всех изменений до исходного состояния или последнего сохранения. Теперь я переписал некоторые коды, пожалуйста, посмотрите. Я просто хочу сказать, давайте забудем о крестиках-ноликах, но я хочу добиться того, чтобы цикл избегал повторяемости и динамически вызывал имя переменной JButtons.   -  person Jan Jeremy    schedule 05.01.2016
comment
Пример: я объявляю новое имя переменной buttonName как тип String, чтобы поймать markbox_ + variableColumnNumber + _ + variableRowNumber при увеличении variableColumnNumber и variableRowNumber. Как видите, есть markbox_00_00, markbox_00_01, markbox_00_02, markbox_01_00, markbox_01_01 и так далее.   -  person Jan Jeremy    schedule 05.01.2016
comment
@JanJeremy все еще неясно. Если вы хотите уведомить меня или кого-то конкретно, вы можете пометить их, и они получат уведомление, чтобы пометить кого-то, сделайте это как @ имя пользователя (без пробела между именем пользователя и @), как я сделал с вами в 1-м слове этот комментарий :)   -  person Frakcool    schedule 05.01.2016
comment
@Frakcool @mxb @Hovercraft Full Of Eels Привет @JB Nizet, извините, ребята, я не смог вас понять. Но я хочу знать следующее: можно ли сделать String конкретным именем переменной JButton для вызова/доступа/редактирования для изменения/получения их свойств, таких как getText(), setText(), setBackground , и так далее; Я действительно не знаю, но я слышал что-то вроде использования Map?   -  person Jan Jeremy    schedule 06.01.2016
comment
@JanJeremy, вероятно, что-то вроде [этого]( stackoverflow.com/questions/6729605/)?   -  person Frakcool    schedule 06.01.2016
comment
Или это?   -  person Frakcool    schedule 06.01.2016


Ответы (1)


Вам, вероятно, нужно переделать свою программу и перефразировать свой вопрос, потому что неясно, где вы застряли, поэтому я написал этот ответ как вики сообщества.

Следующая программа создает GridLayout для доски и добавляет 2 JButtons под ним, которые содержат кнопки «Сохранить» и «Отменить».

Всякий раз, когда вы нажимаете кнопку, она меняет свой текст на 0 или 1 в зависимости от предыдущего состояния кнопки, а кнопка «Отменить» отменяет последний клик таким же образом, если это было 0, оно станет 1 и наоборот.

Я думаю, вам следует прочитать Как написать ActionListener перед копированием - вставив этот пример, понять, о чем он говорит, и попытаться понять, как работает эта программа.

Логика кнопки «Сохранить» зависит от вас, потому что я не уверен, что вы хотите там делать, и я не собираюсь писать весь код за вас. Это сделано только для того, чтобы вы поняли, как обрабатывать события.

Кроме того, логика завершения игры остается за вами по тем же причинам, что и кнопка «Сохранить».

Хотел бы я знать, как записать свой экран в Ubuntu и сохранить в формате GIF, но вот скриншот того, как выглядит эта программа:

введите здесь описание изображения

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();
    }
}
person Community    schedule 05.01.2016