Java 如何呈现复选框?

Java 如何呈现复选框?,java,swing,glazedlists,Java,Swing,Glazedlists,我在jTable中使用了glassed列表,其中有一个布尔列。 默认情况下,jTable呈现一个复选框,其中列的类型为Boolean.Class。 使用釉面列表,我无法获得所需的复选框。我渲染了扩展DefaultTableCellRenderer的复选框,但我不满意它,因为复选框不可“单击” 在德国劳埃德船级社常见问题解答中,我发现: *问:如何指定使用复选框呈现布尔表单元格? 由于某些原因,Glalled List没有getColumnClass()方法 答:如果需要指定column类,则需要

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

在德国劳埃德船级社常见问题解答中,我发现:

*问:如何指定使用复选框呈现布尔表单元格? 由于某些原因,Glalled List没有getColumnClass()方法

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

你们中的一些人对此有经验吗?我没有找到任何与示例相关的链接。常见问题解答中的基本链接已断开

我试过这个:

 public class CheckBoxTableModel implements  AdvancedTableFormat {

     public Class getColumnClass(int column) {
         if(column==4)
        return Boolean.class;
         else
             return Object.class;
    }
}
 TicketTableFormat tbFormat = new TicketTableFormat();
 TicketsModel = new EventTableModel(textFilteredTickets, tbFormat);
 ticketTable.setModel(TicketsModel);
请帮忙

编辑: 我尝试了这个,但带有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.");
        }

    }

您是否在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)
public int getColumnCount()
公共字符串getColumnName(int列)
公共对象getColumnValue(E模型,int列)
public boolean可编辑(E model,int column)//用于使复选框可编辑
公共IFdsModel setColumnValue(E模型、对象值、int列)
公共类getColumnClass(int column)//用于将其设置为复选框
公共比较器getColumnParator(int arg0)//用于排序(如果您有SortedList)
编辑:一个示例(快速和肮脏)

import java.util.Comparator;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.SwingUtilities;
导入ca.odell.glazedlist.BasicEventList;
导入ca.odell.glazedlists.EventList;
导入ca.odell.glazedlists.gui.AdvancedTableFormat;
导入ca.odell.glazedlists.gui.WritableTableFormat;
导入ca.odell.glazedlists.swing.EventTableModel;
公共类测试员{
私有静态类MyBoolean{
私有布尔b=Boolean.FALSE;
公共布尔getB(){
返回b;
}
公共空立根(布尔b){
这个.b=b;
}
}
私有静态类BooleanTableFormat实现AdvancedTableFormat、WritableTableFormat{
@凌驾
public int getColumnCount(){
返回1;
}
@凌驾
公共字符串getColumnName(int列){
返回“Bool”;
}
@凌驾
公共对象getColumnValue(MyBoolean baseObject,int列){
返回baseObject.getB();
}
@凌驾
公共类getColumnClass(int列){
返回Boolean.class;
}
@凌驾
公共比较器GetColumnParator(int列){
抛出新的IllegalStateException(“尚未实现”);
}
@凌驾
公共布尔值可编辑(MyBoolean baseObject,int列){
返回true;
}
@凌驾
公共MyBoolean setColumnValue(MyBoolean baseObject、Object editedValue、int列){
setB((布尔)editedValue);
返回基本对象;
}
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
事件列表=新的基本事件列表();
添加(新的MyBoolean());
添加(新的MyBoolean());
EventTableModel etm=新的EventTableModel(列表,新的BooleanTableFormat());
JTable table=新JTable(etm);
JFrame f=新JFrame(“测试仪”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 设置大小(300200);
f、 getContentPane().add(新的JScrollPane(表));
f、 setVisible(真);
}
});
}
}

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

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

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


应该可以,您确定4是布尔列的索引吗(索引是从零开始的,即第一个==0)?是的,我知道(仅打印值true/false无复选框):/不确定是否有帮助,但死链接应该指向。只需再次检查advancedFormat是否按预期调用:添加println(c
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);
        }
    });

}
}