如何渲染复选框?

时间:2011-04-20 09:37:11

标签: java swing glazedlists

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

在GL faq http://www.glazedlists.com/documentation/faq中我找到了:

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

答:如果需要指定列类,则需要实现AdvancedTableFormat接口而不是常规的TableFormat类。 如果您使用的是GlazedLists.tableFormat()工厂方法,则必须指定基础Object的类才能正确实现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);

2 个答案:

答案 0 :(得分:2)

这里的基本点是渲染表格单元格并将它们排除是两回事。对于表格单元格渲染,渲染器仅用作“标记”,即复选框初始化为应渲染的状态,而表格只是渲染渲染器(通过调用其绘制方法)并放置纹理图片在适当的单元格中 - 为了渲染所有单元格,一次又一次地重新配置复选框的相同实例以表示相应的单元格值。您在代码中所做的是指定模型的数据类型风格,以便表选择的默认表格单元格渲染器是复选框渲染器。

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

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

答案 1 :(得分:1)

您是否实施了isEditable(...)&amp;你的AdvancedTableFormat实现中的setColumnValue(...)?

实施以下方法对我有用。

public int getColumnCount()
public String getColumnName(int column)
public Object getColumnValue(E model, int column)
public boolean isEditable(E model, int column) // For making the checkbox editable
public IFdsModel setColumnValue(E model, Object value, int column)
public Class getColumnClass(int column) // For making it a Checkbox
public Comparator<E> getColumnComparator(int arg0) // for sorting (if you have a SortedList)

编辑:一个例子(快速和肮脏)

import java.util.Comparator;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;

import ca.odell.glazedlists.BasicEventList;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.gui.AdvancedTableFormat;
import ca.odell.glazedlists.gui.WritableTableFormat;
import ca.odell.glazedlists.swing.EventTableModel;

public class Tester {

private static class MyBoolean {
    private Boolean b = Boolean.FALSE;

    public Boolean getB() {
        return b;
    }

    public void setB(Boolean b) {
        this.b = b;
    }

}

private static class BooleanTableFormat implements AdvancedTableFormat<MyBoolean>, WritableTableFormat<MyBoolean> {

    @Override
    public int getColumnCount() {
        return 1;
    }

    @Override
    public String getColumnName(int column) {
        return "Bool";
    }

    @Override
    public Object getColumnValue(MyBoolean baseObject, int column) {
        return baseObject.getB();
    }

    @Override
    public Class getColumnClass(int column) {
        return Boolean.class;
    }

    @Override
    public Comparator getColumnComparator(int column) {
        throw new IllegalStateException("Not yet implemented.");
    }

    @Override
    public boolean isEditable(MyBoolean baseObject, int column) {
        return true;
    }

    @Override
    public MyBoolean setColumnValue(MyBoolean baseObject, Object editedValue, int column) {
        baseObject.setB((Boolean) editedValue);
        return baseObject;
    }
}

public static void main(String[] args) {

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            EventList<MyBoolean> list = new BasicEventList<MyBoolean>();
            list.add(new MyBoolean());
            list.add(new MyBoolean());
            EventTableModel<MyBoolean> etm = new EventTableModel<MyBoolean>(list, new BooleanTableFormat());
            JTable table = new JTable(etm);
            JFrame f = new JFrame("Tester");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(300, 200);
            f.getContentPane().add(new JScrollPane(table));
            f.setVisible(true);
        }
    });

}
}