Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.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,它有3列,前两列是复选框。我通过覆盖DefaultTableModel使它们成为复选框。像这样: tableData = new DefaultTableModel(columnNames, 0) { /** private static final long serialVersionUID = 1L; @Override public Class<?> getColumnClass(int c

我有一个JTable,它有3列,前两列是复选框。我通过覆盖DefaultTableModel使它们成为复选框。像这样:

tableData = new DefaultTableModel(columnNames, 0) {
        /**
        private static final long serialVersionUID = 1L;

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            if (columnIndex == 0 || columnIndex == 1)
                return Boolean.class;
            return super.getColumnClass(columnIndex);
        }
}
tableData=新的DefaultTableModel(columnNames,0){
/**
私有静态最终长serialVersionUID=1L;
@凌驾
公共类getColumnClass(int columnIndex){
如果(columnIndex==0 | | columnIndex==1)
返回Boolean.class;
返回super.getColumnClass(columnIndex);
}
}
我的问题是,如果单击单元格中的任意位置,复选框将选中或取消选中。我想它,所以它只做它时,框本身是点击


我确实看到了执行此操作的其他选项,但它们需要一种不同的方法来创建表中的复选框。有没有一种简单的方法来实现这一点,保持我已经开始使用的方法?

也许在
JPanel
的中心设置一个
JCheckBox
,因为
JTable
的默认值
布尔值
TableCellEditor
可能更简单:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

public class CheckBoxPanelCellTest {
  private JComponent makeUI() {
    String[] columnNames = {"String", "Boolean"};
    Object[][] data = {
      {"AAA", true}, {"bbb", false}
    };
    DefaultTableModel model = new DefaultTableModel(data, columnNames) {
      @Override public Class<?> getColumnClass(int column) {
        if (column == 1) {
          return Boolean.class;
        }
        return super.getColumnClass(column);
      }
      @Override public boolean isCellEditable(int row, int column) {
        return column == 1;
      }
    };
    JTable table = new JTable(model) {
      @Override public void updateUI() {
        setDefaultEditor(Boolean.class, null);
        super.updateUI();
        setDefaultEditor(Boolean.class, new CheckBoxPanelEditor());
      }
    };
    table.setRowHeight(24);
    table.setRowSelectionAllowed(true);
    table.setShowVerticalLines(false);
    table.setIntercellSpacing(new Dimension(0, 1));
    table.setFocusable(false);
    return new JScrollPane(table);
  }
  public static void main(String... args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.getContentPane().add(new CheckBoxPanelCellTest().makeUI());
    f.setSize(320, 240);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
}

class CheckBoxPanelEditor extends AbstractCellEditor implements TableCellEditor {
  private final JPanel p = new JPanel(new GridBagLayout());
  private final JCheckBox checkBox = new JCheckBox();
  public CheckBoxPanelEditor() {
    super();
    checkBox.setOpaque(false);
    checkBox.addActionListener(new ActionListener() {
      @Override public void actionPerformed(ActionEvent e) {
        fireEditingStopped();
      }
    });
    p.add(checkBox);
    p.setBorder(BorderFactory.createEmptyBorder(0, 1, 0, 0));
  }
  @Override public Component getTableCellEditorComponent(
      JTable table, Object value, boolean isSelected, int row, int column) {
    checkBox.setSelected(Objects.equals(value, Boolean.TRUE));
    p.setBackground(table.getSelectionBackground());
    return p;
  }
  @Override public Object getCellEditorValue() {
    return checkBox.isSelected();
  }
}
import java.awt.*;
导入java.awt.event.*;
导入java.util.*;
导入javax.swing.*;
导入javax.swing.table.*;
公共类CheckBoxPanelCellTest{
私有JComponent makeUI(){
String[]columnNames={“String”,“Boolean”};
对象[][]数据={
{“AAA”,真},{“bbb”,假}
};
DefaultTableModel=新的DefaultTableModel(数据、列名){
@重写公共类getColumnClass(int列){
如果(列==1){
返回Boolean.class;
}
返回super.getColumnClass(column);
}
@重写公共布尔值isCellEditable(int行,int列){
返回列==1;
}
};
JTable表格=新JTable(型号){
@重写公共void updateUI(){
setDefaultEditor(Boolean.class,null);
super.updateUI();
setDefaultEditor(Boolean.class,新的CheckBoxPanelEditor());
}
};
表2.设置行高(24);
table.setRowSelectionAllowed(真);
表1.设置显示(假);
表.设置单元间距(新尺寸(0,1));
表1.setFocusable(假);
返回新的JScrollPane(表);
}
公共静态void main(字符串…参数){
invokeLater(新的Runnable(){
@重写公共无效运行(){
createAndShowGUI();
}
});
}
公共静态void createAndShowGUI(){
JFrame f=新的JFrame();
f、 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f、 getContentPane().add(新的CheckBoxPanelCellTest().makeUI());
f、 设置大小(320240);
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
}
类CheckBoxPanelEditor扩展AbstractCellEditor实现TableCellEditor{
private final JPanel p=new JPanel(new GridBagLayout());
私有最终JCheckBox复选框=新JCheckBox();
公共CheckBoxPanelEditor(){
超级();
复选框.setOpaque(false);
checkBox.addActionListener(新建ActionListener()){
@覆盖已执行的公共无效操作(ActionEvent e){
fireEditingStopped();
}
});
p、 添加(复选框);
p、 setboorder(BorderFactory.createEmptyByOrder(0,1,0,0));
}
@重写公共组件getTableCellEditorComponent(
JTable表,对象值,布尔值(选定,int行,int列){
checkBox.setSelected(Objects.equals(value,Boolean.TRUE));
p、 挫折背景(table.getSelectionBackground());
返回p;
}
@重写公共对象getCellEditorValue(){
返回checkBox.isSelected();
}
}

我就是这个,我被发送到这里,代码为JCheckBox绘制了几次滚动,那么JCheckBox的焦点必须有代码行,或者可以在这里解决,为什么你想让你的应用程序不那么可用?用户会喜欢一个更大的点击区域。这是因为附近的栏目实际上选择了该项目,所以我认为尝试选择该项目是令人讨厌的。。。但是要改变复选框的值。我不认为用户会喜欢在复选框之外有更大的点击区域。。。将导致意外选择,并使选择单元格变得不可能。