如何在JTable中添加JCheckBox?

如何在JTable中添加JCheckBox?,第1张

package test;
import javaawtBorderLayout;
import javaawtComponent;
import javaxswingDefaultCellEditor;
import javaxswingJCheckBox;
import javaxswingJFrame;
import javaxswingJPanel;
import javaxswingJScrollPane;
import javaxswingJTable;
import javaxswingtableDefaultTableModel;
import javaxswingtableTableCellRenderer;
import javaxswingtableTableColumnModel;
@SuppressWarnings("serial")
public class TestJtable extends JPanel {

public TestJtable(){
init();
}
private void init() {
setLayout(new BorderLayout());
JScrollPane scrollPane = new JScrollPane(createTable());
add(scrollPane);
}

private JTable createTable() {
JTable table = new JTable();
String[] tableHeads = new String[]{"姓名","年龄","是否通过"};
DefaultTableModel dtm = (DefaultTableModel)tablegetModel();
dtmsetColumnIdentifiers(tableHeads);
/添加的一些数据,也可以从数据库中提取数据/
dtmaddRow(new Object[]{"aa","12",new Boolean(true)});
dtmaddRow(new Object[]{"bb","34",new Boolean(false)});
dtmaddRow(new Object[]{"aa","12",new Boolean(false)});
dtmaddRow(new Object[]{"bb","34",new Boolean(false)});
dtmaddRow(new Object[]{"aa","12",new Boolean(false)});
dtmaddRow(new Object[]{"bb","34",new Boolean(false)});
dtmaddRow(new Object[]{"aa","12",new Boolean(false)});
dtmaddRow(new Object[]{"bb","34",new Boolean(false)});
dtmaddRow(new Object[]{"aa","12",new Boolean(false)});
dtmaddRow(new Object[]{"bb","34",new Boolean(false)});
dtmaddRow(new Object[]{"aa","12",new Boolean(false)});
dtmaddRow(new Object[]{"bb","34",new Boolean(false)});
dtmaddRow(new Object[]{"aa","12",new Boolean(false)});
dtmaddRow(new Object[]{"bb","34",new Boolean(false)});
/设置table的列模型/
TableColumnModel tcm = tablegetColumnModel();
tcmgetColumn(2)setCellEditor(new DefaultCellEditor(new JCheckBox()));
tcmgetColumn(2)setCellRenderer(new TestTableCellRenderer());
tcmgetColumn(2)setPreferredWidth(80);
tcmgetColumn(2)setWidth(80);
tcmgetColumn(2)setMaxWidth(80);
return table;
}
public static void main(String[] args) {
JFrame jframe = new JFrame();
jframesetBounds(300,100,300,200);
jframesetTitle("测试");
jframeadd(new TestJtable());
jframesetVisible(true);
}
class TestTableCellRenderer extends JCheckBox implements TableCellRenderer{
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
Boolean b = (Boolean) value;
thissetSelected(bbooleanValue());
return this;
}

}
}
一直没有时间给你说,不好意思。今天下午有点空。有什么不明白的。可以问我。

问题拆分来看,其实就是一个渲染和表格单元格选中事件,以下代码仅做参考:
final JComboBox comboBox = new JComboBox();
groups = new ArrayList<String>();
comboBoxsetEditable(true);
TableComboBoxEditor editor = new TableComboBoxEditor(comboBox);
tablegetColumnModel()getColumn(2)setCellEditor(editor);
tablegetModel()addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
if (egetType() == TableModelEventUPDATE && egetColumn() == 2) {
int lastRow = egetLastRow();
Object value = tablegetValueAt(lastRow, 2);
if (value != null && !valueequals("") && !groupscontains(valuetoString())) {
String item = valuetoString();
groupsadd(item);
comboBoxaddItem(item);
comboBoxsetSelectedItem(item);
}
}
}
});

addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
requestFocus();
}
});

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

import javaawtComponent;
 import javaawteventActionEvent;
 import javaawteventActionListener;
 
 import javaxswing;
 import javaxswingtable;
 
 
 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();
         panelsetSize(thisgetWidth(), thisgetHeight());
         panelsetLocation(0,0);
         panelsetLayout(null);
         
         // 初始化表格
         table = new JTable(new DefaultTableModel(new Object[][]{{"第一行"},{"第二行"},{"第三行"},{"第四行"}}, new String[]{"测试行1","测试行2"}){
             / (non-Javadoc)
               重写方法,判断表单元格是否可编辑
               可以通过row和column索引判断某一个单元格是否可编辑
               此处设为都不可编辑
               @see javaxswingtableDefaultTableModel#isCellEditable(int, int)
              /
             @Override
             public boolean isCellEditable(int row, int column) {
                 return false;
             }
         });
         
         // 开始向表格中添加复选框(注意:此示例较为简单,缺省很多判断,也没有动态代码支持)
         // 通过设置列渲染
         
         // 方法一:直接方式 使用TableColumn的setCellRenderer方法(推荐)
         // 此方法可以设置某一列的渲染(即使用某一个组件--即控件来显示单元格数据)
         tablegetColumnModel()getColumn(1)setCellRenderer(new TableCellRenderer(){
 
              /(non-Javadoc)
               此方法用于向方法调用者返回某一单元格的渲染器(即显示数据的组建--或控件)
               可以为JCheckBox JComboBox JTextArea 等
               @see javaxswingtableTableCellRenderer#getTableCellRendererComponent(javaxswingJTable, javalangObject, boolean, boolean, int, int)
              /
             @Override
             public Component getTableCellRendererComponent(JTable table,
                     Object value, boolean isSelected, boolean hasFocus,
                     int row, int column) {
                 // 创建用于返回的渲染组件
                 JCheckBox ck = new JCheckBox();
                 // 使具有焦点的行对应的复选框选中
                 cksetSelected(isSelected);
                 // 设置单选boxsetSelected(hasFocus);
                 // 使复选框在单元格内居中显示
                 cksetHorizontalAlignment((int) 05f);
                 return ck;
             }});
         
         // 方法二:先设置列编辑器,然后设置单元格渲染
         // 设置列编辑器
         // 在以复选框为对象设置列编辑器时,必须保证该列能够被编辑,否则无法更改状态
         // (此步骤可以省略,省略时不要忘记将列设为不可编辑)
         // tablegetColumnModel()getColumn(1)setCellEditor(new DefaultCellEditor(new JCheckBox()));
         
         // 设置单元格渲染(这里是设置表格级别的渲染)
         /tablesetDefaultRenderer(Objectclass, 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();
                     boxsetSelected(isSelected);
                     // 设置单选boxsetSelected(hasFocus);
                     boxsetHorizontalAlignment((int) CENTER_ALIGNMENT);    // 05f
                     return box;
                     }
                 // 如果不是需要渲染的列,封装文本域显示数据
                 return new JTextArea(valuetoString());
             }});/
         
         // 在多选是需要按住Ctrl键或者鼠标按住拖过连续的需要选中的行,应该给用户说明
         // 第一种方法是被推荐的,因为它具有选中的高亮显示,界面能更加友好
         tablesetSize(panelgetWidth(),panelgetHeight() - 90);
         tablesetLocation(0, 0);
         
         
         btn = new JButton("Test");
         btnsetSize(80,40);
         btnsetLocation((panelgetWidth()) / 2 - 40, panelgetHeight() - 80);
         
         // 按钮点击时显示当前选中项
         btnaddActionListener(new ActionListener(){
 
             @Override
             public void actionPerformed(ActionEvent e) {
                 for(int rowindex : tablegetSelectedRows()){
                     JOptionPaneshowMessageDialog(null, rowindex + " " + tablegetValueAt(rowindex, 0));
                 }
             }});
         
         paneladd(table);
         paneladd(btn);
         thisadd(panel);    
         
     }
     
     // 定义一些必要的组件
     private JPanel panel;
     private JTable table;
     private JButton btn;
 }

这个可以用MouseListener来监听。
tableaddMouseListener();

//括号内的东西根据实际填写
……
public
void
mouseClicked(MouseEvent
e)
{
int
index=tablegetSelectedRow();
String
code=(String)tablegetValueAt(index,0);//这一句是取出表格选中那行的第一列
text1setText(code);
//其他列的数据类似,不逐一说明,自己研究即可。
}

第一种方法:
按照你的数据模型l转成二维数组 String[][] 直接放入jtable构造器里就可以了吧new jtable(st);
第二种方法:
另外实现方法最好自定义一个Model,这个也不难

你是想是实现,在某一列可以显示时间,  并且点击时间后面的图标可以显示时间选择器,然后选择时间吧

1,写一个MyModel继承与AbstractTableModel: 用于当数据模型, 填充数据,删除数据等

2,写一个MyRenderer实现TableCellRenderer 主要实现getTableCellRendererComponent方法 用于返回一个外观,  这就是日期列的渲染器 可以渲染该列看起来的样子,比如看起来就是一个文本框,里面的文字是xx年xx月xx日

3,写一个MyEditor实现TableCellEditor接口, 也需要重写getTableCellEditorComponent等方法, 这就是日期列的编辑器, 就是当点击日期列时, 处于编辑状态时的状态,显示日期选择器 选择好时间后, 文本框的文字变成了cc年cc月cc日

比如可以把性别列渲染成单选按钮组, 兴趣列渲染成复选框如下

String[] columnNames = {"第一列", "第二列"}; //定义列字段信息
Object[][] cellData = {{"11", "12"},{"21", "22"}}; //定义表格数据字段
JTable table = new JTable(cellData, columnNames);
然后可以直接将这个table添加到指定的容器上,例如有一个JFrame对象f,可以通过fadd(table)的方式来添加。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/13370965.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-23
下一篇 2023-07-23

发表评论

登录后才能评论

评论列表(0条)

保存