Как поместить переменные из строки в массив? - PullRequest
0 голосов
/ 04 мая 2018

Я делаю проект, в котором у меня есть сетка кнопок J, и я хочу иметь возможность сохранить, какая из этих кнопок нажата в массив. Я знаю, как получить координаты для каждой кнопки, но совершенно не знаю, как мне сделать массив и изменить координаты, хранящиеся внутри, всякий раз, когда нажимается JButton. Мой код выглядит следующим образом:

public ButtonGrid(int width, int length, String coords) {
    frame.setLayout(new GridLayout(width, length));
    grid = new JButton[width][length];
    state = new HashMap<JButton, String>();

    for (int y = 0; y < length; y++) {
        for (int x = 0; x < width; x++) {
            final JButton nb = new JButton();
            nb.setPreferredSize(new Dimension(50, 50));
            grid[x][y] = nb;
            state.put(grid[x][y], "blank");

            nb.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    Object source = e.getSource();
                    for (int i = 0; i < grid.length; i++) {
                        for (int j = 0; j < grid.length; j++) {
                            if (source == grid[i][j]) {
                                String coords = String.valueOf(grid[i][j]);
                                System.out.println(
                                        Stream.of(coords.split("\\D+")).limit(3).collect(Collectors.toList()));
                            }
                        }
                    }

                    if (state.get(nb).equals("blank"))
                        mapButtonToColor(nb, "red");
                    else if (state.get(nb).equals("red"))
                        mapButtonToColor(nb, "blank");
                    setButtonColors();
                }
            });
            frame.add(grid[x][y]);
        }
    }

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
}

}

1 Ответ

0 голосов
/ 04 мая 2018

Во-первых, я предлагаю вам использовать наследование

public class GridButton extends JButton {
    int x, y;
   // String state; // probably put this here instead 
    public GridButton(int x, int y) {
        super();
        this.x = x;
        this.y = y;
    } 
}

Тогда вам понадобится список больше, чем массив, потому что массивы имеют фиксированный размер, и вы сможете нажимать столько раз, сколько хотите

List<int[]> list = new ArrayList<>();

С указанным выше классом при нажатии вместо проверки всей сетки вы получаете немедленный доступ к позициям

Сначала используйте класс, поэтому замените

final JButton nb = new JButton();

с

final JButton nb = new GridButton(x, y);

И в слушателе действий, получить доступ к значениям, а также добавить в список

@Override 
public void actionPerformed(ActionEvent e) {
    GridButton source = (GridButton) e.getSource();
    list.add(new int[] {source.x, source.y});
}

изменение координат, хранящихся внутри, при каждом нажатии JButton

Я не уверен, почему вы это сделаете, но вам придется изменить как саму кнопку с помощью методов установки этого класса, так и заменить / сбросить массив кнопок с новым позиционированием

...