如何将字符串中的变量放入数组中?

时间:2018-05-04 00:56:22

标签: java arrays jbutton

我正在制作一个项目,我有一个JButtons网格,我希望能够保存哪些按钮被点击到一个数组中。我知道如何获得每个按钮的坐标,但是对于我如何制作数组以及在点击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 :(得分:1)

首先,我建议你使用继承

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时更改存储在内部的坐标

我不确定你为什么这样做,但是你必须通过该类的setter方法修改按钮本身,以及使用新的定位交换/重置Button数组