2011-04-20 114 views
1

我使用Glazed列表,在jTable里我有一个布尔列。 默认情况下,jTable呈现一个复选框,其中列的类型为Boolean.Class。 使用玻璃清单我不能得到需要的复选框。我提供了扩展DefaultTableCellRenderer的复选框,但我不满意它,因为复选框不是“可点击的”。如何呈现复选框?

在GL FAQ http://www.glazedlists.com/documentation/faq我发现:

* Q:我如何指定我的布尔表格单元格有一个复选框来呈现? 出于某种原因,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); 
+0

应该工作,你确定4是布尔列的索引(索引从零开始,这是第一次== 0)? – kleopatra 2011-04-20 10:20:48

+0

是的,我知道。 :(只打印出值true/false没有复选框:/ – xplorer00 2011-04-20 11:38:32

+0

不确定它有帮助,但死链接应指向[here](http://java.net/projects/glazedlists/lists/users/archive/2004-12/message/0) – trashgod 2011-04-20 12:28:52

回答

1

你有没有实现isEditable(... )& setColumnValue(...)在您的AdvancedTableFormat的实现?

实施以下方法适用于我。

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

} 
} 
+0

我会尝试编辑:)谢谢 – xplorer00 2011-04-21 08:38:47

+0

我试过我的例子,我以编辑的形式发布了问题。 jtable所在的表单没有显示。 – xplorer00 2011-04-21 08:49:06

+0

你能提供一个可运行的例子吗?你上面的例子不能运行... – 2011-04-21 17:03:48

2

这里的基本观点是,渲染表格单元格和eiting它们是两个不同的东西。对于表格单元格渲染,渲染器仅用作'印章',即复选框被初始化为应该呈现的状态,而表格的前部仅采用渲染器的图片(通过调用其绘图方法)并将图片图片在适当的单元格中 - 为了渲染所有单元格,同一个复选框实例会一遍又一遍地重新配置以表示相应的单元格值。您在代码中所做的是指定模型的数据类型风格,以便表格选择的默认表格单元格渲染器是复选框渲染器。

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

简而言之:渲染器仅在单元格上加盖数据,即输出,编辑器组件是必要的以接收输入。