Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTable:向所有选定组件发送关键事件,以选中所有选定复选框_Java_Swing_Jtable - Fatal编程技术网

Java JTable:向所有选定组件发送关键事件,以选中所有选定复选框

Java JTable:向所有选定组件发送关键事件,以选中所有选定复选框,java,swing,jtable,Java,Swing,Jtable,我有带有复选框的JTable(因为getColumnClass是Boolean)。 用户选择多行,并单击空格,但只有“lead selection”复选框会获得KeyEvent,并被选中 如何选中所有选中的复选框 这看起来是一项非常简单的任务,但我找不到“官方”的方法来完成,我不想使用黑客 我可以覆盖表中的processKeyEvent,并将true物理设置为模型中的所有值,但它看起来不太好。我遵循了@camickr和@Jean Willian S.J的建议,并做到了: import javax

我有带有复选框的
JTable
(因为
getColumnClass
Boolean
)。 用户选择多行,并单击
空格
,但只有“lead selection”复选框会获得
KeyEvent
,并被选中

如何选中所有选中的复选框

这看起来是一项非常简单的任务,但我找不到“官方”的方法来完成,我不想使用黑客


我可以覆盖表中的
processKeyEvent
,并将
true
物理设置为模型中的所有值,但它看起来不太好。

我遵循了@camickr和@Jean Willian S.J的建议,并做到了:

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.lang.reflect.InvocationTargetException;

public class TableTest {
    private static final int CHECKBOX_COL = 0;


    public static void main(String[] args) throws InvocationTargetException, InterruptedException {
        SwingUtilities.invokeAndWait(() -> {
            var frame = new JFrame("TableTest");

            Object[][] data = {new Object[]{true, "Foo"}, new Object[]{false, "Buz"}};
            MyModel dm = new MyModel(data, new Object[]{"Enabled", "Name"});
            var table = new JTable(dm);
            var invertSelected = "InvertSelected";
            table.getInputMap().remove(KeyStroke.getKeyStroke("SPACE"));
            table.getInputMap().put(KeyStroke.getKeyStroke("SPACE"), invertSelected);
            table.getActionMap().put(invertSelected, new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    TableModel model = table.getModel();
                    for (int selectedRow : table.getSelectedRows()) {
                        var row = table.convertRowIndexToModel(selectedRow);
                        var value = !(Boolean) model.getValueAt(row, CHECKBOX_COL);
                        model.setValueAt(value, row, CHECKBOX_COL);
                    }
                }
            });
            table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);

            frame.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
            frame.pack();
            frame.setVisible(true);

        });
    }

    private static class MyModel extends DefaultTableModel {

        public MyModel(Object[][] data, Object[] columnNames) {
            super(data, columnNames);
        }

        @Override
        public boolean isCellEditable(int row, int column) {
            return column == CHECKBOX_COL;
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return (columnIndex == CHECKBOX_COL ? Boolean.class : String.class);
        }
    }

}

import javax.swing.*;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.TableModel;
导入java.awt.*;
导入java.awt.event.ActionEvent;
导入java.lang.reflect.InvocationTargetException;
公共类表格测试{
私有静态最终整数复选框\u COL=0;
公共静态void main(字符串[]args)抛出InvocationTargetException、InterruptedException{
SwingUtilities.invokeAndWait(()->{
var框架=新JFrame(“表格测试”);
对象[][]数据={new Object[]{true,“Foo”},新对象[]{false,“Buz”};
MyModel dm=新的MyModel(数据,新对象[]{“已启用”,“名称”});
var表=新的JTable(dm);
var invertSelected=“invertSelected”;
table.getInputMap().remove(KeyStroke.getKeyStroke(“空格”));
table.getInputMap().put(击键.getKeyStroke(“空格”),已选中);
table.getActionMap().put(已选择,新建AbstractAction()){
@凌驾
已执行的公共无效操作(操作事件e){
TableModel模型=table.getModel();
for(int-selectedRow:table.getSelectedRows()){
var行=table.convertRowIndexToModel(selectedRow);
var value=!(布尔)model.getValueAt(行,复选框);
model.setValueAt(值、行、复选框);
}
}
});
table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE\u INTERVAL\u SELECTION);
frame.getContentPane();
frame.pack();
frame.setVisible(true);
});
}
私有静态类MyModel扩展了DefaultTableModel{
公共MyModel(对象[][]数据,对象[]列名称){
超级(数据、列名称);
}
@凌驾
公共布尔值可编辑(int行,int列){
返回列==复选框\列;
}
@凌驾
公共类getColumnClass(int columnIndex){
返回(columnIndex==CHECKBOX\u COL?Boolean.class:String.class);
}
}
}

它现在起作用了。谢谢大家

我按照@camickr和@Jean Willian S.J的建议做了:

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.lang.reflect.InvocationTargetException;

public class TableTest {
    private static final int CHECKBOX_COL = 0;


    public static void main(String[] args) throws InvocationTargetException, InterruptedException {
        SwingUtilities.invokeAndWait(() -> {
            var frame = new JFrame("TableTest");

            Object[][] data = {new Object[]{true, "Foo"}, new Object[]{false, "Buz"}};
            MyModel dm = new MyModel(data, new Object[]{"Enabled", "Name"});
            var table = new JTable(dm);
            var invertSelected = "InvertSelected";
            table.getInputMap().remove(KeyStroke.getKeyStroke("SPACE"));
            table.getInputMap().put(KeyStroke.getKeyStroke("SPACE"), invertSelected);
            table.getActionMap().put(invertSelected, new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    TableModel model = table.getModel();
                    for (int selectedRow : table.getSelectedRows()) {
                        var row = table.convertRowIndexToModel(selectedRow);
                        var value = !(Boolean) model.getValueAt(row, CHECKBOX_COL);
                        model.setValueAt(value, row, CHECKBOX_COL);
                    }
                }
            });
            table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);

            frame.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
            frame.pack();
            frame.setVisible(true);

        });
    }

    private static class MyModel extends DefaultTableModel {

        public MyModel(Object[][] data, Object[] columnNames) {
            super(data, columnNames);
        }

        @Override
        public boolean isCellEditable(int row, int column) {
            return column == CHECKBOX_COL;
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return (columnIndex == CHECKBOX_COL ? Boolean.class : String.class);
        }
    }

}

import javax.swing.*;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.TableModel;
导入java.awt.*;
导入java.awt.event.ActionEvent;
导入java.lang.reflect.InvocationTargetException;
公共类表格测试{
私有静态最终整数复选框\u COL=0;
公共静态void main(字符串[]args)抛出InvocationTargetException、InterruptedException{
SwingUtilities.invokeAndWait(()->{
var框架=新JFrame(“表格测试”);
对象[][]数据={new Object[]{true,“Foo”},新对象[]{false,“Buz”};
MyModel dm=新的MyModel(数据,新对象[]{“已启用”,“名称”});
var表=新的JTable(dm);
var invertSelected=“invertSelected”;
table.getInputMap().remove(KeyStroke.getKeyStroke(“空格”));
table.getInputMap().put(击键.getKeyStroke(“空格”),已选中);
table.getActionMap().put(已选择,新建AbstractAction()){
@凌驾
已执行的公共无效操作(操作事件e){
TableModel模型=table.getModel();
for(int-selectedRow:table.getSelectedRows()){
var行=table.convertRowIndexToModel(selectedRow);
var value=!(布尔)model.getValueAt(行,复选框);
model.setValueAt(值、行、复选框);
}
}
});
table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE\u INTERVAL\u SELECTION);
frame.getContentPane();
frame.pack();
frame.setVisible(true);
});
}
私有静态类MyModel扩展了DefaultTableModel{
公共MyModel(对象[][]数据,对象[]列名称){
超级(数据、列名称);
}
@凌驾
公共布尔值可编辑(int行,int列){
返回列==复选框\列;
}
@凌驾
公共类getColumnClass(int columnIndex){
返回(columnIndex==CHECKBOX\u COL?Boolean.class:String.class);
}
}
}

它现在起作用了。谢谢大家

Define:但看起来不太好。。JTable的设计使您一次只能编辑一个单元格。因此,您需要的是JTable设计之外的内容。另一种选择是向JTable添加一个键绑定,以处理空格键。调用该操作时,您将遍历选定的行,并将模型中的值设置为
true
。难道您不能使用table.getSelectedRows()获取所有选定的行,然后使用table.convertRowIndexToModel(行)循环遍历这些行,将其转换为模型等效行吗?使用这些转换后的行,您可以将模型中的值设置为true。@camickr我不在乎我的id