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()
),表将获取该值并将其写回该单元格的表模型
简而言之:渲染器只是在单元格上标记数据,即输出,需要一个编辑器组件来接收输入
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);
}
});
}
}