根据数据类型,具有不同类型单元格的 Jtable

Posted

技术标签:

【中文标题】根据数据类型,具有不同类型单元格的 Jtable【英文标题】:Jtable with different types of cells depending on data type 【发布时间】:2013-06-02 23:26:50 【问题描述】:

如何根据特定行显示的输入类型来实现具有不同类型单元格编辑器的 JTable?

例如

有些行可能是复选框(用于布尔类型) 有些行可能是组合框(如果我想提供一组固定的选项可供选择) 某些行可能是文本字段(如果我允许任意数据)。

目前我已经实现了AbstractTableModel,它从我的对象中获取一组自定义字段对象并将行添加到表中。我想通过设置特定类型的单元格来进一步自定义我的表格。我可以根据该行包含的字段类型来确定使用哪种单元格类型。

表模型是在运行时动态创建的。

【问题讨论】:

为 TableCellRenderer 创建 EachRowRenderer 没有问题,但从未见过,尝试过(如果有的话)使用 TableCellEditor,顺便说一句,JTable 的值是否存储在 Default 或 AbstractTableModel 中并不重要 【参考方案1】:
某些行可能是复选框(用于布尔类型) 有些行可能是组合框(如果我想提供一组固定的选项可供选择) 某些行可能是文本字段(如果我允许任意数据)。

例如

import java.awt.EventQueue;
import java.util.Date;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;


public class EachRowRendererEditor 

    private JFrame frame = new JFrame("EachRowRendererEditor");
    private  String[] columnNames = "Type", "Value";
    private     Object[][] data = 
            "String", "I'm a string",
            "Date", new Date(),
            "Integer", new Integer(123),
            "Double", new Double(123.45),
            "Boolean", Boolean.TRUE;
   private  JScrollPane scrollPane;
   private  JTable table;

    public EachRowRendererEditor() 
        table = new JTable(data, columnNames) 

            private static final long serialVersionUID = 1L;
            private Class editingClass;

            @Override
            public TableCellRenderer getCellRenderer(int row, int column) 
                editingClass = null;
                int modelColumn = convertColumnIndexToModel(column);
                if (modelColumn == 1) 
                    Class rowClass = getModel().getValueAt(row, modelColumn).getClass();
                    return getDefaultRenderer(rowClass);
                 else 
                    return super.getCellRenderer(row, column);
                
            

            @Override
            public TableCellEditor getCellEditor(int row, int column) 
                editingClass = null;
                int modelColumn = convertColumnIndexToModel(column);
                if (modelColumn == 1) 
                    editingClass = getModel().getValueAt(row, modelColumn).getClass();
                    return getDefaultEditor(editingClass);
                 else 
                    return super.getCellEditor(row, column);
                
            
            //  This method is also invoked by the editor when the value in the editor
            //  component is saved in the TableModel. The class was saved when the
            //  editor was invoked so the proper class can be created.

            @Override
            public Class getColumnClass(int column) 
                return editingClass != null ? editingClass : super.getColumnClass(column);
            
        ;
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        scrollPane = new JScrollPane(table);
        frame.add(scrollPane);
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    

    public static void main(String[] args) 
        EventQueue.invokeLater(new Runnable() 

            @Override
            public void run() 
                EachRowRendererEditor eeee = new EachRowRendererEditor();
            
        );
    

【讨论】:

+1 立即提供示例。使用JTable.getDefaultRenderer,这很简单。 使用这个作为参考,我可能也可以使用类似javaworld.com/javaworld/javatips/jw-javatip102.html 的东西相对容易地实现组合框? @TT。这个ZOO有一个bug(不是官方的),这里找不到,记得只在Substance(DefaultTableCellRenderer)中解决,现在不知道是不是 @Keikoku do you meaning,可以放在那里 AutoComplete JComboBox/JTextField as TableCellEditor,注意没有理由使用 HashMap,DefaultTableModel 可以轻松做到这一点:-),永远不要将 JComponents 放在 XxxTableModel 中,用于 JComboBox (作为渲染器和编辑器)仅存储字符串值(取决于 ComboBoxModel 的数据类型) +1 概述的方法示例here。【参考方案2】:

创建一个实现 javax.swing.table.TableCellRenderer 的自定义类,该类使用您要根据数据类型显示的控件来显示值。使用此类的实例作为单元格渲染器 (TableColumn.setCellRenderer)

【讨论】:

以上是关于根据数据类型,具有不同类型单元格的 Jtable的主要内容,如果未能解决你的问题,请参考以下文章

浅析JTable与TableModelTableCellRendererTableCellEditor接口——使用JComboBox显示单元格的值

JTable 单元格更新不起作用

JTable里怎么得到修改后单元格里的值

Swing-JTable检测单元格数据变更事件

JTable,如何设置不同的边边框

在java中创建了jtable,怎么获取这个表中某行某列的数据(即某单元格的数据int值)??