我正在使用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);
答案 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);
}
});
}
}