Java JTable中的多行选择

我有一个JTable,它的一列是不可编辑的文本,第二列是一个显示布尔值的复选框…。现在我要的是,当用户选择多行并取消选中其中的任何一个时选中的复选框,则选中的所有复选框都应取消选中,反之亦然。

回答:

使用@Hovercraft的示例和@camickr的建议,以下示例显示了合适的用户界面。尽管它使用按钮,但它SelectionAction也适用于菜单或弹出窗口。

import java.awt.*;

import java.awt.event.ActionEvent;

import javax.swing.*;

import javax.swing.DefaultListSelectionModel;

import javax.swing.table.DefaultTableModel;

/** @see http://stackoverflow.com/questions/4526779 */

public class CheckABunch extends JPanel {

private static final int CHECK_COL = 1;

private static final Object[][] DATA = {

{"One", Boolean.TRUE}, {"Two", Boolean.FALSE},

{"Three", Boolean.TRUE}, {"Four", Boolean.FALSE},

{"Five", Boolean.TRUE}, {"Six", Boolean.FALSE},

{"Seven", Boolean.TRUE}, {"Eight", Boolean.FALSE},

{"Nine", Boolean.TRUE}, {"Ten", Boolean.FALSE}};

private static final String[] COLUMNS = {"Number", "CheckBox"};

private DataModel dataModel = new DataModel(DATA, COLUMNS);

private JTable table = new JTable(dataModel);

private DefaultListSelectionModel selectionModel;

public CheckABunch() {

super(new BorderLayout());

this.add(new JScrollPane(table));

this.add(new ControlPanel(), BorderLayout.SOUTH);

table.setPreferredScrollableViewportSize(new Dimension(250, 175));

selectionModel = (DefaultListSelectionModel) table.getSelectionModel();

}

private class DataModel extends DefaultTableModel {

public DataModel(Object[][] data, Object[] columnNames) {

super(data, columnNames);

}

@Override

public Class<?> getColumnClass(int columnIndex) {

if (columnIndex == CHECK_COL) {

return getValueAt(0, CHECK_COL).getClass();

}

return super.getColumnClass(columnIndex);

}

@Override

public boolean isCellEditable(int row, int column) {

return column == CHECK_COL;

}

}

private class ControlPanel extends JPanel {

public ControlPanel() {

this.add(new JLabel("Selection:"));

this.add(new JButton(new SelectionAction("Clear", false)));

this.add(new JButton(new SelectionAction("Check", true)));

}

}

private class SelectionAction extends AbstractAction {

boolean value;

public SelectionAction(String name, boolean value) {

super(name);

this.value = value;

}

@Override

public void actionPerformed(ActionEvent e) {

for (int i = 0; i < dataModel.getRowCount(); i++) {

if (selectionModel.isSelectedIndex(i)) {

dataModel.setValueAt(value, i, CHECK_COL);

}

}

}

}

private static void createAndShowUI() {

JFrame frame = new JFrame("CheckABunch");

frame.add(new CheckABunch());

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.pack();

frame.setLocationRelativeTo(null);

frame.setVisible(true);

}

public static void main(String[] args) {

java.awt.EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

createAndShowUI();

}

});

}

}

以上是 Java JTable中的多行选择 的全部内容, 来源链接: utcz.com/qa/427044.html

回到顶部