如何将这两个渲染器应用于同一个JTable?

Kla*_*sos 0 java swing jtable tablecellrenderer tablemodel

如何将单元格渲染器和表格模型应用于同一个JTable?问题是,如果我应用单元格渲染器,JTable则不显示Boolean类型字段的复选框.但是,如果我不应用单元格渲染器,则时间字段(JodaTime)格式不正确.

        model = new DefaultTableModel(data, columnNames) 
        {

            private static final long serialVersionUID = 1L;

            @Override
            public int getColumnCount() {
                return columnNames.length;
            }

            @Override
            public int getRowCount() {
                return data.length;
            }

            @Override
            public String getColumnName(int col) {
                return (String) columnNames[col];
            } 

            @Override
            public Object getValueAt(int row, int column) {
                return data[row][column];
            }

            @Override
            public Class getColumnClass(int column) {
                return (getValueAt(0, column).getClass());
            }

            @Override
            public void setValueAt(Object value, int row, int column) {
                data[row][column] = value;
            }

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

        };

        DefaultTableCellRenderer cellRenderer = new DefaultTableCellRenderer() 
        {
            public Component getTableCellRendererComponent( JTable table, Object value, boolean
                                                            isSelected, boolean hasFocus, int row, int column)
            {
                super.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column );
                if ( value instanceof LocalTime )
                {
                    DateTimeFormatter formatter = DateTimeFormat.forPattern("HH:mm");
                    String strTime = formatter.print((LocalTime)value);
                    this.setText(strTime);
                }

                return this;
            }

        };

table = new JTable(model);
        for (int i = 0; i < table.getColumnCount(); ++i) 
        {
            table.getColumnModel().getColumn(i).setCellRenderer(cellRenderer);
        }
Run Code Online (Sandbox Code Playgroud)

cam*_*ckr 5

您无需创建全新的DefaultTableModel.您需要覆盖的唯一方法是getColumnClass()返回为给定列存储的数据类的方法.

实际上我不知道你的模型是如何工作的.DefaultTableModel使用Vector of Vectors来存储数据,您不应该尝试引用称为"data"的外部2D数组.

接下来的问题是为什么要尝试将自定义渲染器分配给所有列?如果要将渲染器用于日期对象,则应执行以下操作:

table.setDefaultRenderer(Date.class, cellRenderer);
Run Code Online (Sandbox Code Playgroud)

然后日期将使用该渲染器,所有其他列将使用提供的渲染器.