1

我想要完成的是:

*包含按钮矩阵的窗口。假设是 10x10。

*按钮应该是“1”或“0”,当我点击它们时会改变。

*按钮的值(1 或 0)应存储在String[][]矩阵中。

目前我有一个String[][]包含值的二维数组。我可以使用以下代码在带有可点击按钮的窗口中显示它:

//dim = 10
//matrix is the 10x10 String[][] matrix containing 1s or 0s

private static void convertMatrixToGUI() {
    JFrame f = new JFrame("Window containing a matrix");
    JPanel p = new JPanel();
    p.setLayout(new GridLayout(dim, dim));

    for(int r = 0; r < dim; r++){
        for(int c = 0; c < dim; c++){
            p.add(new JButton(matrix[r][c]));
        }
    }
    f.add(p);
    f.pack();
    f.setVisible(true);
}

下一步是在单击按钮时更改矩阵中的值。如果我单击 0,它应该将其更改为 1,反之亦然。这些值必须始终存储在 中String[][]

如何通过单击图形矩阵中的按钮来更改字符串矩阵中的内容?如果我单击位置处的按钮[5][2],程序如何知道我要将字符串矩阵更改为位置[5][2]

最好的问候山羊猫

4

5 回答 5

4

GridButtonPanel说明基本原理。替代JToggleButton以获得二进制选择/未选择状态的效果。

图片

于 2013-06-17T08:36:35.007 回答
2

你需要的是一个 ActionListener。

本教程让您了解如何使用它。

http://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html

于 2013-06-17T08:39:03.263 回答
2

我给你一个JButton名为的扩展的例子,ChangingButton它有矩阵位置和分配给它的矩阵。此外,它会创建一个ActionListener将在单击时更改名称的名称。

public static class ChangingButton extends JButton {

    private final int[][] fModel;
    private final int fX;
    private final int fY;

    public ChangingButton(final int x, final int y, final int[][] model) {
        fX= x;
        fY= y;
        fModel= model;

        addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                fModel[fX][fY] = fModel[fX][fY] == 1 ? 0 : 1;
                updateNameFromModel();
            }
        });
        updateNameFromModel();
    }

    private void updateNameFromModel() {
        setText(String.valueOf(fModel[fX][fY]));
    }

}

这是您的主要测试课程。

public static void main(String[] args) {

    int dim=10;
    int matrix[][] = new int[10][10];

    JFrame f = new JFrame("Window containing a matrix");
    JPanel p = new JPanel();
    p.setLayout(new GridLayout(dim, dim));

    for(int r = 0; r < dim; r++){
        for(int c = 0; c < dim; c++){
            ChangingButton button= new ChangingButton(r, c, matrix);
            p.add(button);
        }
    }
    f.add(p);
    f.pack();
    f.setVisible(true);

}

希望能帮助到你。如果您有不明白的地方,请询问。

于 2013-06-17T08:49:04.247 回答
2

尝试一下

        int DIM = 10;
    String [][]matrix = new String[DIM][DIM];
    JButton [][]butt = new JButton[DIM][DIM];

    JFrame f = new JFrame("Window containing a matrix");
    JPanel p = new JPanel();

    for(int r=0; r<DIM; r++){
        for(int c=0; c<DIM; c++){
            butt[r][c] = new JButton(matrix[r][c]);
            p.add(butt[r][c]);
            butt[r][c].addActionListener(this); //if your class extends ActionListener
        }
    }

    f.add(p);
    f.pack();
    f.setVisible(true);

并覆盖 actionPerformed 方法。实现你的代码:)

@Override
    public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub

    }
于 2013-06-17T08:59:24.720 回答
1
 for(int r = 0; r < dim; r++) {
       for(int c = 0; c < dim; c++){
           JButton temp = new JButton(matrix[r][c])
           temp.addActionListener(new ActionListener() {
              public void actionPerformed(ActionEvent e) {
                matrix[r][c] = (matrix[r][c].equals("0")) ? "1" : "0"; //or for changing text of the button this.setText("1") or "0"
              }
           })
          p.add(temp);
       }
   }
于 2013-06-17T08:47:17.620 回答