1

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

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

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

A:如果需要指定列类,需要实现AdvancedTableFormat接口,而不是常规的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);
4

2 回答 2

2

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

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

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

于 2011-04-21T05:02:48.340 回答
1

您是否在 AdvancedTableFormat 的实现中实现了 isEditable(...) 和 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);
        }
    });

}
}
于 2011-04-21T04:43:46.173 回答