如何获取for循环JTable中所有行的复选框?
How to get checkbox on all rows in for loop JTable?
我已经在 eclipse 中创建了一个 table。 table 具有编号的行。这是代码:
public class JTableRowHeader {
private JFrame frame = new JFrame("JTable RowHeader");
private JScrollPane scrollPane;
private JTable table;
private DefaultTableModel model;
private TableRowSorter<TableModel> sorter;
private JTable headerTable;
private JCheckBox chckbxNewCheckBox; // declared check box
private JCheckBox all;
//private List<JCheckBox> checkBoxes;
public JTableRowHeader() {
int NoOfRows = 60;
table = new JTable(NoOfRows, 2);
for (int i = 0; i < table.getRowCount(); i++) {
table.setValueAt(i, i, 0);
}
sorter = new TableRowSorter<TableModel>(table.getModel());
table.setRowSorter(sorter);
model = new DefaultTableModel() {
};
table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
model.fireTableRowsUpdated(0, model.getRowCount() - 1);
}
});
scrollPane = new JScrollPane(table);
scrollPane.setRowHeaderView(headerTable);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(scrollPane);
chckbxNewCheckBox = new JCheckBox("New check box");
scrollPane.setColumnHeaderView(chckbxNewCheckBox);
frame.pack();
frame.setLocation(150, 150);
frame.setVisible(true);
}
public static void main(String[] args) {
try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if (info.getName().equals("Nimbus")) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (Exception e) {
//e.printStackTrace();
}
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JTableRowHeader TestTableRowHeader = new JTableRowHeader();
frame.add(new CheckBoxGroup(); //trying to add the check box
}
});
}
}
既然我已经创建了 table,我想为 table 中的所有行添加一个复选框。当我更改 table 中的行数时,我也希望复选框能够改变,例如 如果我有 4 行,我想要 4 个复选框,如果我将它增加到 60 行,我想要 60 个复选框。我尝试了几次但都失败了。我对此还很陌生,所以任何使用我的代码的帮助都将不胜感激。
阅读 How to Use Tables 上 Swing 教程的部分,了解基础知识和工作示例,以帮助您入门。
关键是:
对于带有组合框的列,您需要将 DefaultTableModel 的 getColumnClass(...)
方法覆盖为 return Boolean.class。
然后在您设置数据的循环中,您需要将数据添加到您的 TableModel。
所以代码应该是这样的:
table.setValueAt(i, i, 0);
table.setValueAt(Boolean.FALSE, I, 1); // add the check box
I want to do it without the Object[ ] method
是的,这是更好的方法。您永远不应创建具有固定大小的 TableModel。创建具有 0 行的 table,然后仅使用 addRow(...) 方法让 table 在您添加数据行时动态增长。
这比使用 setValueAt(...) 更好。
您必须创建一个包含布尔字段(与默认复选框一起显示)的模式
public class MyTableModel extends DefaultTableModel implements TableModel {
private List<JCheckBox> list;
public List<JCheckBox> getList() {
return list;
}
public void setList(List<JCheckBox> list) {
this.list = list;
fireTableDataChanged();
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public int getRowCount() {
if(list != null) {
return list.size();
}
return super.getRowCount();
}
@Override
public Class<?> getColumnClass(int column) {
if(column == 0) {
return Boolean.class;
}
return super.getColumnClass(column);
}
@Override
public boolean isCellEditable(int row, int column) {
return column == 0;
}
@Override
public Object getValueAt(int row, int column) {
if(column == 0) {
return list.get(row).isSelected();
}
return "";
}
@Override
public void setValueAt(Object aValue, int row, int column) {
if(column == 0) {
list.get(row).setSelected((Boolean) aValue);
}
}
}
例如,这是用 JCheckBox 对象的数组/列表进行初始化(尽管没有特别的实际意义...)
public class JTableRowHeader {
private JFrame frame;
private JScrollPane scrollPane;
private JTable table;
public JTableRowHeader() {
table = new JTable(new MyTableModel());
scrollPane = new JScrollPane(table);
frame = new JFrame("JTable RowHeader");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(scrollPane, BorderLayout.CENTER);
frame.pack();
frame.setLocation(150, 150);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JTableRowHeader testTableRowHeader = new JTableRowHeader();
JCheckBox checkBoxes[] = new JCheckBox[60];
for(int i = 0; i < checkBoxes.length; i++) {
checkBoxes[i] = new JCheckBox("Check box " + i);
}
((MyTableModel)testTableRowHeader.table.getModel()).setList(Arrays.asList(checkBoxes));
});
}
}
我已经在 eclipse 中创建了一个 table。 table 具有编号的行。这是代码:
public class JTableRowHeader {
private JFrame frame = new JFrame("JTable RowHeader");
private JScrollPane scrollPane;
private JTable table;
private DefaultTableModel model;
private TableRowSorter<TableModel> sorter;
private JTable headerTable;
private JCheckBox chckbxNewCheckBox; // declared check box
private JCheckBox all;
//private List<JCheckBox> checkBoxes;
public JTableRowHeader() {
int NoOfRows = 60;
table = new JTable(NoOfRows, 2);
for (int i = 0; i < table.getRowCount(); i++) {
table.setValueAt(i, i, 0);
}
sorter = new TableRowSorter<TableModel>(table.getModel());
table.setRowSorter(sorter);
model = new DefaultTableModel() {
};
table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
model.fireTableRowsUpdated(0, model.getRowCount() - 1);
}
});
scrollPane = new JScrollPane(table);
scrollPane.setRowHeaderView(headerTable);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(scrollPane);
chckbxNewCheckBox = new JCheckBox("New check box");
scrollPane.setColumnHeaderView(chckbxNewCheckBox);
frame.pack();
frame.setLocation(150, 150);
frame.setVisible(true);
}
public static void main(String[] args) {
try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if (info.getName().equals("Nimbus")) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (Exception e) {
//e.printStackTrace();
}
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JTableRowHeader TestTableRowHeader = new JTableRowHeader();
frame.add(new CheckBoxGroup(); //trying to add the check box
}
});
}
}
既然我已经创建了 table,我想为 table 中的所有行添加一个复选框。当我更改 table 中的行数时,我也希望复选框能够改变,例如 如果我有 4 行,我想要 4 个复选框,如果我将它增加到 60 行,我想要 60 个复选框。我尝试了几次但都失败了。我对此还很陌生,所以任何使用我的代码的帮助都将不胜感激。
阅读 How to Use Tables 上 Swing 教程的部分,了解基础知识和工作示例,以帮助您入门。
关键是:
对于带有组合框的列,您需要将 DefaultTableModel 的
getColumnClass(...)
方法覆盖为 return Boolean.class。然后在您设置数据的循环中,您需要将数据添加到您的 TableModel。
所以代码应该是这样的:
table.setValueAt(i, i, 0);
table.setValueAt(Boolean.FALSE, I, 1); // add the check box
I want to do it without the Object[ ] method
是的,这是更好的方法。您永远不应创建具有固定大小的 TableModel。创建具有 0 行的 table,然后仅使用 addRow(...) 方法让 table 在您添加数据行时动态增长。
这比使用 setValueAt(...) 更好。
您必须创建一个包含布尔字段(与默认复选框一起显示)的模式
public class MyTableModel extends DefaultTableModel implements TableModel {
private List<JCheckBox> list;
public List<JCheckBox> getList() {
return list;
}
public void setList(List<JCheckBox> list) {
this.list = list;
fireTableDataChanged();
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public int getRowCount() {
if(list != null) {
return list.size();
}
return super.getRowCount();
}
@Override
public Class<?> getColumnClass(int column) {
if(column == 0) {
return Boolean.class;
}
return super.getColumnClass(column);
}
@Override
public boolean isCellEditable(int row, int column) {
return column == 0;
}
@Override
public Object getValueAt(int row, int column) {
if(column == 0) {
return list.get(row).isSelected();
}
return "";
}
@Override
public void setValueAt(Object aValue, int row, int column) {
if(column == 0) {
list.get(row).setSelected((Boolean) aValue);
}
}
}
例如,这是用 JCheckBox 对象的数组/列表进行初始化(尽管没有特别的实际意义...)
public class JTableRowHeader {
private JFrame frame;
private JScrollPane scrollPane;
private JTable table;
public JTableRowHeader() {
table = new JTable(new MyTableModel());
scrollPane = new JScrollPane(table);
frame = new JFrame("JTable RowHeader");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(scrollPane, BorderLayout.CENTER);
frame.pack();
frame.setLocation(150, 150);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JTableRowHeader testTableRowHeader = new JTableRowHeader();
JCheckBox checkBoxes[] = new JCheckBox[60];
for(int i = 0; i < checkBoxes.length; i++) {
checkBoxes[i] = new JCheckBox("Check box " + i);
}
((MyTableModel)testTableRowHeader.table.getModel()).setList(Arrays.asList(checkBoxes));
});
}
}