我有一个JXTreeTable
有 5 列的结构,我必须使最后一个(布尔类型)可编辑。
我已经尝试了任何东西,在谷歌上搜索了几个小时,我在这里搜索了 SO,我发现了类似的问题,但它们对我的具体情况没有帮助(那是因为他们给出了关于组件问题JTrees
或简单问题JTables
而不是JXTreeTable
组件问题的答案)。
我已经getColumnClass(int column)
在树模型中指定了使最后一列中的布尔单元格呈现为JCheckBoxes
的isCellEditable(Object node, int column)
方法,以及返回列并使其可编辑的方法。
实际上,我正在使用从数据库中读取文件的查询填充该列,并将其中一些单元格设置为 true(如果它们满足要求)。
这是我的 GUI 实际外观的链接:
如果您需要查看我的一些代码,请告诉我,并感谢您的建议!
这是树的构造:
DefaultMutableTreeNode albero = initTree();
final JXTreeTable binTree = new JXTreeTable(new MyTreeModel(albero));
Highlighter highligher = HighlighterFactory.createSimpleStriping(HighlighterFactory.BEIGE);
binTree.setHighlighters(highligher);
binTree.setShowGrid(false);
binTree.setShowsRootHandles(true);
binTree.setEditable(true);
configureCommonTableProperties(binTree);
binTree.setTreeCellRenderer(new TreeTableCellRenderer());
TreeModel的定义:
public class MyTreeModel extends AbstractTreeTableModel {
private String [] titles = {"Utente", "Radice Menù", "Programma", "Descrizione", "Abilitazione"};
public MyTreeModel(DefaultMutableTreeNode root) {
super(root);
}
@Override
public String getColumnName(int column) {
if (column < titles.length)
return (String) titles[column];
else
return "";
}
@Override
public boolean isCellEditable(Object node, int column) {
return column == 4;
}
@Override
public int getColumnCount() {
return titles.length;
}
@Override
public Class getColumnClass(int column) {
if (column == 4 )
return Boolean.class;
else
return String.class;
}
@Override
public Object getValueAt(Object arg0, int arg1) {
if(arg0 instanceof TableRowData) {
TableRowData data = (TableRowData)arg0;
if(data != null) {
switch(arg1) {
case 0: return data.getUtente();
case 1: return data.getRott();
case 2: return data.getProgramma();
case 3: return data.getDescrizione();
case 4: return data.getFlag();
}
}
}
}
if(arg0 instanceof DefaultMutableTreeNode) {
DefaultMutableTreeNode dataNode = (DefaultMutableTreeNode)arg0;
TableRowData data = (TableRowData)dataNode.getUserObject();
if(data != null) {
switch(arg1) {
case 0: return data.getUtente();
case 1: return data.getRott();
case 2: return data.getProgramma();
case 3: return data.getDescrizione();
case 4: return data.getFlag();
}
}
}
@Override
public Object getChild(Object arg0, int arg1) {
if(arg0 instanceof DefaultMutableTreeNode) {
DefaultMutableTreeNode nodes = (DefaultMutableTreeNode)arg0;
return nodes.getChildAt(arg1);
}
return null;
}
@Override
public int getChildCount(Object arg0) {
if(arg0 instanceof DefaultMutableTreeNode) {
DefaultMutableTreeNode nodes = (DefaultMutableTreeNode)arg0;
return nodes.getChildCount();
}
return 0;
}
@Override
public int getIndexOfChild(Object arg0, Object arg1) {
if(arg0 instanceof DefaultMutableTreeNode && arg1 instanceof DefaultMutableTreeNode) {
DefaultMutableTreeNode parent = (DefaultMutableTreeNode) arg0;
return parent.getIndex((DefaultMutableTreeNode) arg1);
}
return 0;
}
@Override
public boolean isLeaf(Object node) {
return getChildCount(node) == 0;
}
return null;
}
以及为行数据实现 get/set 方法的类:
public class TableRowData {
private String utente = null;
private String rott;
private String programma;
private boolean flag;
private String descrizione;
private boolean isRoot;
public TableRowData(String Utente, String Rott, String Programma, String Descrizione, Boolean Flag, boolean isLeaf) {
this.utente = Utente;
this.rott = Rott;
this.programma = Programma;
this.flag = Flag;
this.descrizione = Descrizione;
this.isRoot = isLeaf;
}
/**
* @return the isRoot
*/
public boolean isRoot() {
return isRoot;
}
/**
* @param isRoot the isRoot to set
*/
public void setRoot(boolean isLeaf) {
this.isRoot = isLeaf;
}
public String getUtente() {
return utente;
}
public void setUtente(String Utente) {
this.utente = Utente;
}
public String getRott() {
return rott;
}
public void setRott(String Rott) {
this.rott = Rott;
}
public String getProgramma() {
return programma;
}
public void setProgramma(String Programma) {
this.programma = Programma;
}
public Boolean getFlag() {
return flag;
}
public void setFlag(Boolean Flag) {
this.flag = Flag;
}
public String getDescrizione() {
return descrizione;
}
public void setDescrizione(String descrizione) {
this.descrizione = descrizione;
}
}