在循环中创建的按钮在单击时都执行相同的操作
Buttons created in a loop are all doing the same thing when clicked
我目前正尝试在 Java 中使用来自互联网的 ButtonColumn
做一些事情,这允许我在 JTable
单元格中创建可点击的按钮。但我需要制作多个按钮,并为每个按钮指定它自己的操作参数。所以我有这个代码:
DefaultTableModel dtm = (DefaultTableModel) jTable1.getModel();
dtm.setNumRows(uziv.size());
int riadok = 0;
for (int i = 0; i < uziv.size(); i++) {
jTable1.setValueAt(uziv.get(i).getMeno(), riadok, 0);
jTable1.setValueAt(uziv.get(i).getPriezvisko(), riadok, 1);
jTable1.setValueAt(uziv.get(i).getEmail(), riadok, 2);
jTable1.setValueAt(uziv.get(i).getLogin(), riadok, 3);
int idUz = uziv.get(i).getId();
Action ban = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
DefaultTableModel dtm = (DefaultTableModel) jTable1.getModel();
int modelRow = Integer.valueOf(e.getActionCommand());
db.zabanujUzivatela(db.selectId(idUz));
}
};
ButtonColumn col = new ButtonColumn(jTable1, ban, 4);
riadok++;
}
但问题是我的 idUziv
即使它在 for cyclus 期间发生变化,最后当我 运行 我的程序并单击任何按钮时,所有按钮都指向相同的 idUziv
当他们的动作被执行时。而且我真的不知道我还能怎么做。我需要让它像第一个按钮点击会指向 idUziv
与值 1 例如,第二个与值 2 等等......你知道如何识别吗?或者有可能吗?
非常感谢您的每一个回答
ButtonColumn col = new ButtonColumn(jTable1, ban, 4);
您不能为每一行创建一个 ButtonColumn
。 class 名称是“...列”。编辑器是针对整个专栏的。所有行只有一个操作。因此需要通用地编写 Action,以便它适用于所有行。
But I am in need to make multiple buttons and for each button specified it´s own parameter for its action.
将 ID 存储为 TableModel 的一部分。所以你需要创建一个table,其中包含一个ID列,然后在将数据加载到TableModel时设置id:
jTable1.setValueAt(uziv.get(i).getLogin(), riadok, 3);
//int idUz = uziv.get(i).getId();
jTable1.setValueAt(uziv.get(i).getId(), riadok, 4);
然后您可以从 JTable 中删除 TableColumn,这样该列就不可见了:
table.removeColumn( table.getColumn(...) );
现在,在您的 Action 中,您可以访问所选行的 TableModel 中的 ID。
或者另一种选择是将 ID 嵌入按钮列的文本中,如 TableButtonColumn
中的示例所示,以便您看到 "Login ID1"。然后你只需从模型中获取文本并解析出最后一个词。
我目前正尝试在 Java 中使用来自互联网的 ButtonColumn
做一些事情,这允许我在 JTable
单元格中创建可点击的按钮。但我需要制作多个按钮,并为每个按钮指定它自己的操作参数。所以我有这个代码:
DefaultTableModel dtm = (DefaultTableModel) jTable1.getModel();
dtm.setNumRows(uziv.size());
int riadok = 0;
for (int i = 0; i < uziv.size(); i++) {
jTable1.setValueAt(uziv.get(i).getMeno(), riadok, 0);
jTable1.setValueAt(uziv.get(i).getPriezvisko(), riadok, 1);
jTable1.setValueAt(uziv.get(i).getEmail(), riadok, 2);
jTable1.setValueAt(uziv.get(i).getLogin(), riadok, 3);
int idUz = uziv.get(i).getId();
Action ban = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
DefaultTableModel dtm = (DefaultTableModel) jTable1.getModel();
int modelRow = Integer.valueOf(e.getActionCommand());
db.zabanujUzivatela(db.selectId(idUz));
}
};
ButtonColumn col = new ButtonColumn(jTable1, ban, 4);
riadok++;
}
但问题是我的 idUziv
即使它在 for cyclus 期间发生变化,最后当我 运行 我的程序并单击任何按钮时,所有按钮都指向相同的 idUziv
当他们的动作被执行时。而且我真的不知道我还能怎么做。我需要让它像第一个按钮点击会指向 idUziv
与值 1 例如,第二个与值 2 等等......你知道如何识别吗?或者有可能吗?
非常感谢您的每一个回答
ButtonColumn col = new ButtonColumn(jTable1, ban, 4);
您不能为每一行创建一个 ButtonColumn
。 class 名称是“...列”。编辑器是针对整个专栏的。所有行只有一个操作。因此需要通用地编写 Action,以便它适用于所有行。
But I am in need to make multiple buttons and for each button specified it´s own parameter for its action.
将 ID 存储为 TableModel 的一部分。所以你需要创建一个table,其中包含一个ID列,然后在将数据加载到TableModel时设置id:
jTable1.setValueAt(uziv.get(i).getLogin(), riadok, 3);
//int idUz = uziv.get(i).getId();
jTable1.setValueAt(uziv.get(i).getId(), riadok, 4);
然后您可以从 JTable 中删除 TableColumn,这样该列就不可见了:
table.removeColumn( table.getColumn(...) );
现在,在您的 Action 中,您可以访问所选行的 TableModel 中的 ID。
或者另一种选择是将 ID 嵌入按钮列的文本中,如 TableButtonColumn
中的示例所示,以便您看到 "Login ID1"。然后你只需从模型中获取文本并解析出最后一个词。