java - 如何呈现复选框?

标签 java swing glazedlists

我在 jTable 中使用 Glazed 列表,其中有一列是 boolean 值。 默认情况下,jTable 呈现一个复选框,其中列的类型为 Boolean.Class。 使用 Glazed 列表我无法获得所需的复选框。我渲染了扩展 DefaultTableCellRenderer 的复选框,但我对它不满意,因为复选框不是“可点击的”。

在 GL 常见问题 http://www.glazedlists.com/documentation/faq我发现:

*问:如何指定我的 boolean 表格单元格用复选框呈现? 出于某种原因,Glazed Lists 没有 getColumnClass() 方法。

A:如果需要指定列类,需要实现AdvancedTableFormat接口(interface),而不是常规的TableFormat类。 如果您使用的是 GlazedLists.tableFormat() 工厂方法,则必须指定对象的基类以正确实现 AdvancedTableFormat.getColumnClass() 方法。*

你们中有人有这方面的经验吗?我没有找到任何带有示例的链接。常见问题解答中的重要链接已损坏。

我试过这个:

 public class CheckBoxTableModel implements  AdvancedTableFormat {

     public Class getColumnClass(int column) {
         if(column==4)
        return Boolean.class;
         else
             return Object.class;
    }
}

请帮忙!

编辑: 我试过这个,带有 jtable 的表单不显示

   private class TicketTableFormat implements AdvancedTableFormat<Ticket>  {

        private final String[] cols = new String[]{"Id", "From", "Subject", "Date", "Incomplete"};

        public int getColumnCount() {
            return cols.length;
        }

        public String getColumnName(int colId) {
            return cols[colId];
        }

        public Class getColumnClass(int col) {
            if (col == 4) {
                return Boolean.class;
            } else {
                return Object.class;
            }
        }


        public Object getColumnValue(Ticket ticket, int colId) {

            switch (colId) {
                case 0:
                    return ticket.getId();
                case 1:
                    return ticket.getFrom();
                case 2:
                    return ticket.getSubject();
                case 3:
                    return ticket.getDate();
                case 4:
                    return ticket.getIncomplete();
            }
            return null;
        }

        public boolean isEditable(Ticket e, int col) {
            if (col < 4) {
                return false;
            } else {
                return true;
            }
        }

        public Ticket setColumnValue(Ticket e, Object o, int i) {
            e.setB((Boolean) editedValue);
            return e;           
           }

        public Comparator getColumnComparator(int i) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

    }

我这样调用它:

 TicketTableFormat tbFormat = new TicketTableFormat();
 TicketsModel = new EventTableModel(textFilteredTickets, tbFormat);
 ticketTable.setModel(TicketsModel);

最佳答案

这里的基本点是渲染表格单元格和编辑它们是两件不同的事情。对于表格单元格渲染,渲染器仅用作“标记”,即复选框被初始化为应渲染的状态,之后表格仅拍摄渲染器的照片(通过调用其绘制方法)并放置 tat 图片在适当的单元格中 - 为了呈现所有单元格,复选框的相同实例一遍又一遍地重新配置以表示相应的单元格值。您在代码中所做的是指定模型的数据类型风格,以便表格选择的默认表格单元格渲染器是复选框渲染器。

要使复选框可编辑,单元格编辑器必须附加到表格单元格(例如,通过为特定列配置编辑器)。如果表格单元格接收到输入焦点,表格单元格编辑器组件将被初始化并放置在表格单元格内(即在渲染器之前绘制的图像上方)。此单元格编辑器组件(在您的情况下将是一个复选框)将保留在那里(通过鼠标或键盘接受用户输入),直到用户导航离开该特定表调用。在编辑结束的那一刻,单元格编辑器被要求提供它从编辑过程中捕获的值,(即 getCellEditorValue() 在编辑器上被调用)并且 hte 值由表和写回该单元格的表模型。

所以简而言之:渲染器只是在单元格上标记数据,即输出,需要一个编辑器组件来接收输入。

关于java - 如何呈现复选框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5728274/

相关文章:

java - 将java数组转换为javascript数组时出错

java - 在过时的操作系统上部署 JavaFX 应用程序

java - 当我尝试使用 Canvas 显示背景图像时出现问题

java - 具有 GlazedLists AutocompleteSupport 的 getSelectedItem JComboBox 返回 Null

java - 在 keyReleased() 事件后引入延迟

java - 如何在 Guava Optional 中保存空值

java - 使用 JMS,如何获取特定目标的最大消息大小?

java - mouseEntered 不会执行

java - 将项目添加到 java 中的 jlist 后,从自动完成组合框中删除该项目

java - Glazedlist 表第一行出现 IndexOutOfBoundsException?