【问题标题】:How to apply these two renderers to the same JTable?如何将这两个渲染器应用于同一个 JTable?
【发布时间】:2014-04-24 08:37:52
【问题描述】:

如何将单元格渲染器和表格模型应用于同一个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);
        }

【问题讨论】:

  • 您无需创建一个全新的 DefaultTableModel。您需要覆盖的唯一方法是 getColumnClass() 方法,用于返回为给定列存储的数据类。事实上,我不知道你的模型是如何工作的。 DefaultTableModel 使用 Vector 的 Vector 来存储数据,您不应尝试引用名为 data 的外部 2D 数组。
  • @camickr:你能举个例子吗?
  • could you give an example? - 删除除 getColumnClass() 和 isCellEditable() 方法之外的所有代码。请参阅我的答案以了解更多详细信息。

标签: java swing jtable tablecellrenderer tablemodel


【解决方案1】:

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

事实上,我不知道你的模型是如何工作的。 DefaultTableModel 使用 Vector 的 Vector 来存储数据,您不应尝试引用名为“data”的外部 2D 数组。

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

table.setDefaultRenderer(Date.class, cellRenderer);

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

【讨论】:

  • 非常感谢。您的第二个建议帮助解决了这个问题:table.setDefaultRenderer(LocalTime.class, cellRenderer);
  • @KlausosKlausos,这只是解决方案的一部分。您的 TableModel 是错误的。我不知道如何强调这一点。修复 TableModel!!!
【解决方案2】:

您的代码中可能有印刷错误?

    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;
        }
    };

【讨论】:

  • 这无助于解决问题。 JTable 中仍然不显示复选框。相反,我看到的是字符串——真或假。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
  • 2019-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多