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

时间:2014-03-18 15:02:33

标签: 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);
        }

2 个答案:

答案 0 :(得分:5)

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

实际上我不知道你的模型是如何工作的。 DefaultTableModel使用Vector of Vectors来存储数据,你不应该试图引用一个名为“data”的外部2D数组。

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

table.setDefaultRenderer(Date.class, cellRenderer);

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

答案 1 :(得分:0)

您的代码中可能存在排版错误?

    DefaultTableCellRenderer cellRenderer = new DefaultTableCellRenderer() 
    {
        public Component getTableCellRendererComponent( JTable table, Object value, boolean
                                                        isSelected, boolean hasFocus, int row, int column)
        {
            Component toReturn= 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);
                toReturn= this;
            }
            else if( value instanceof Boolean ) {
                JCheckbox checkbox= new JCheckbox();
                checkbox.setSelected((Boolean)value));
                toReturn= checkbox;
            }
            return toReturn;
        }
    };