当前位置: 首页 > 面试题库 >

Java JTable中的多行选择

弓玉书
2023-03-14
问题内容

我有一个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();
            }
        });
    }
}


 类似资料:
  • 问题内容: 我目前正在使用JTable来显示数据库中的内容。我想为用户提供便利,以便他可以使用Shift +箭头键选择想要的行数,然后稍后使用提供的删除选项删除那些记录。请提供一个小例子。 问题答案: 您需要允许多项选择: 然后,您需要编写适当的选择侦听器。这有点困难,请尝试在Google相关解决方案中查找。您可以看一个选择侦听器的示例。

  • 问题内容: 我有一个表,值看起来像这样。 如何在mysql中将列区分为类似的内容? 问题答案: 这应该做 db <> fiddle中的演示 更新以添加编号: 在db <> fiddle中编号的演示

  • 问题内容: 我有一张叫的桌子。在该表中,我有以下栏目:,,, 我有另一个表,唯一重要的列是,我想将其与表行进行比较。 该表如下所示: 假设我有一个表(user_meta)像这样: 我想为每个检索单个行,但前提是公司ID和user_type正确。 我想检索在查询中发送的具有相同companyID的所有用户,因此,假设$ companyID = 2,然后所有具有=’staff’的用户。 因此,user

  • 假设我有5个不同的列,< code>a、b、c、d、e,我选择了多行: 例子: 用户有 3 个帖子,因此它将在查询中选择 3 行。 我想对< code>a的所有行的值求和(当然还有其余的)。 例如 值 = 4 值=10 < code >第3行 值= 1 所以我需要把所有这些加起来得到15。 我知道使用< code>array_sum($ratings)来查找数组的总和,但前提是您选择了一个可以有多

  • 问题内容: 如何选择多列的平均值? 假设我有一些数据,例如: 我想得到像 我试过了 但这是行不通的。 有关查询的任何想法可以做到这一点? 问题答案: 尝试 或者

  • 如何用vscode选择多行? 在Visual Studio上,您可以按左alt键并选择多行,但它不适用于vscode。