java swing如何在JTable一个单元格添加多个复选框

这是一个单元格的内容,该如何定义呢,求各位大侠帮帮忙,非常感谢

java swing中在jTable中添加多个复选框的方式如下:

import java.awt.Component;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 
 import javax.swing.*;
 import javax.swing.table.*;
 
 
 public class MyFirstJFrame extends JFrame {
     
     // ä½œä¸ºæµ‹è¯•çš„main方法
     public static void main(String[] args) {
         new MyFirstJFrame().setVisible(true);
     }
     
     /**
      * æž„造方法
      */
     public MyFirstJFrame() {
         InitialComponent();
     }
     
     /**
      * åˆå§‹åŒ–组件的方法
      */
     private void InitialComponent(){
         // è®¾ç½®çª—体参数
 
         // è®¾ç½®å¸ƒå±€æ¨¡å¼
          setLayout(null);
         // è®¾ç½®çª—体大小
         setSize(480, 360);
         // è®¾ç½®çª—体居中(非常规方法)
          setLocationRelativeTo(null);
         // å…³é—­çª—体退出程序
         setDefaultCloseOperation(DISPOSE_ON_CLOSE);
         
         // åˆå§‹åŒ–面板
         panel = new JPanel();
         panel.setSize(this.getWidth(), this.getHeight());
         panel.setLocation(0,0);
         panel.setLayout(null);
         
         // åˆå§‹åŒ–表格
         table = new JTable(new DefaultTableModel(new Object[][]{{"第一行"},{"第二行"},{"第三行"},{"第四行"}}, new String[]{"测试行1","测试行2"}){
             /* (non-Javadoc)
              * é‡å†™æ–¹æ³•ï¼Œåˆ¤æ–­è¡¨å•å…ƒæ ¼æ˜¯å¦å¯ç¼–辑
              * å¯ä»¥é€šè¿‡row和column索引判断某一个单元格是否可编辑
              * æ­¤å¤„设为都不可编辑
              * @see javax.swing.table.DefaultTableModel#isCellEditable(int, int)
              */
             @Override
             public boolean isCellEditable(int row, int column) {
                 return false;
             }
         });
         
         // å¼€å§‹å‘表格中添加复选框(注意:此示例较为简单,缺省很多判断,也没有动态代码支持)
         // é€šè¿‡è®¾ç½®åˆ—渲染
         
         // æ–¹æ³•ä¸€ï¼šç›´æŽ¥æ–¹å¼ ä½¿ç”¨TableColumn的setCellRenderer方法(推荐)
         // æ­¤æ–¹æ³•å¯ä»¥è®¾ç½®æŸä¸€åˆ—的渲染(即使用某一个组件--即控件来显示单元格数据)
         table.getColumnModel().getColumn(1).setCellRenderer(new TableCellRenderer(){
 
              /*(non-Javadoc)
              * æ­¤æ–¹æ³•ç”¨äºŽå‘方法调用者返回某一单元格的渲染器(即显示数据的组建--或控件)
              * å¯ä»¥ä¸ºJCheckBox JComboBox JTextArea ç­‰
              * @see javax.swing.table.TableCellRenderer#getTableCellRendererComponent(javax.swing.JTable, java.lang.Object, boolean, boolean, int, int)
              */
             @Override
             public Component getTableCellRendererComponent(JTable table,
                     Object value, boolean isSelected, boolean hasFocus,
                     int row, int column) {
                 // åˆ›å»ºç”¨äºŽè¿”回的渲染组件
                 JCheckBox ck = new JCheckBox();
                 // ä½¿å…·æœ‰ç„¦ç‚¹çš„行对应的复选框选中
                 ck.setSelected(isSelected);
                 // è®¾ç½®å•é€‰box.setSelected(hasFocus);
                 // ä½¿å¤é€‰æ¡†åœ¨å•å…ƒæ ¼å†…居中显示
                 ck.setHorizontalAlignment((int) 0.5f);
                 return ck;
             }});
         
         // æ–¹æ³•äºŒï¼šå…ˆè®¾ç½®åˆ—编辑器,然后设置单元格渲染
         // è®¾ç½®åˆ—编辑器
         // åœ¨ä»¥å¤é€‰æ¡†ä¸ºå¯¹è±¡è®¾ç½®åˆ—编辑器时,必须保证该列能够被编辑,否则无法更改状态
         // ï¼ˆæ­¤æ­¥éª¤å¯ä»¥çœç•¥ï¼Œçœç•¥æ—¶ä¸è¦å¿˜è®°å°†åˆ—设为不可编辑)
         // table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(new JCheckBox()));
         
         // è®¾ç½®å•å…ƒæ ¼æ¸²æŸ“(这里是设置表格级别的渲染)
         /*table.setDefaultRenderer(Object.class, new TableCellRenderer(){
 
             @Override
             public Component getTableCellRendererComponent(JTable table,
                     Object value, boolean isSelected, boolean hasFocus,
                     int row, int column) {
                 // åˆ¤æ–­æ˜¯å¦ä¸ºéœ€è¦æ¸²æŸ“的列
                 if(column == 1){
                     // å’Œæ–¹æ³•ä¸€åŸºæœ¬ä¸€è‡´
                     JCheckBox box = new JCheckBox();
                     box.setSelected(isSelected);
                     // è®¾ç½®å•é€‰box.setSelected(hasFocus);
                     box.setHorizontalAlignment((int) CENTER_ALIGNMENT);    // 0.5f
                     return box;
                     }
                 // å¦‚果不是需要渲染的列,封装文本域显示数据
                 return new JTextArea(value.toString());
             }});*/
         
         // åœ¨å¤šé€‰æ˜¯éœ€è¦æŒ‰ä½Ctrl键或者鼠标按住拖过连续的需要选中的行,应该给用户说明
         // ç¬¬ä¸€ç§æ–¹æ³•æ˜¯è¢«æŽ¨èçš„,因为它具有选中的高亮显示,界面能更加友好
         table.setSize(panel.getWidth(),panel.getHeight() - 90);
         table.setLocation(0, 0);
         
         
         btn = new JButton("Test");
         btn.setSize(80,40);
         btn.setLocation((panel.getWidth()) / 2 - 40, panel.getHeight() - 80);
         
         // æŒ‰é’®ç‚¹å‡»æ—¶æ˜¾ç¤ºå½“前选中项
         btn.addActionListener(new ActionListener(){
 
             @Override
             public void actionPerformed(ActionEvent e) {
                 for(int rowindex : table.getSelectedRows()){
                     JOptionPane.showMessageDialog(null, rowindex + " " + table.getValueAt(rowindex, 0));
                 }
             }});
         
         panel.add(table);
         panel.add(btn);
         this.add(panel);    
         
     }
     
     // å®šä¹‰ä¸€äº›å¿…要的组件
     private JPanel panel;
     private JTable table;
     private JButton btn;
 }
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-07-01

写了个Demo 效果如图

原理:

jtable可以为指定的列设置一个渲染器, 用来呈现外观(比如让外观显示为复选框,但此时复选框并不能点击选择,他仅仅是个外观而已)

还需要为指定的列设置一个编辑器, 用来处理按钮点击后的编辑(让复选框可以选择)

实现过程

写一个类去继承AbstractTableModel , 用来当数据模型

写一个类去实现TableCellRenderer 接口. 用来当渲染器

写一个类去实现TableCellEditor 接, 用来当编辑器

然后把给表格JTable填充数据, 设置渲染器和编辑器即可

第2个回答  推荐于2017-12-16
有两个方法,
一个是自定义渲染器,自己添加。(或是用JDK已有的渲染器也可以)
二是重写TableModel的getColumnClass

如下就可以。
public Class<?> getColumnClass(int c) {
return getValueAt(0, c).getClass();
}

这样,这一列的数据,都是boolean型的,就会变成复选框追问

有这样的demo吗,发我邮箱看一下,谢谢,[email protected]

追答

JDK的安装目录下就有demo

本回答被提问者和网友采纳
第3个回答  2013-03-19
定义一个含多个复选框的单元格Panel,放置到自定渲染器中。
然后覆写返回值的方法,将复选框选中结果返回就好。
相关示例网上都有,还是自己多动手找找吧追问

非常感谢。

第4个回答  推荐于2018-03-11
用TableModel
在Rending时,添加
相似回答