Jtable 作为 Jtree 节点
Posted
技术标签:
【中文标题】Jtable 作为 Jtree 节点【英文标题】:Jtable as a Jtree Node 【发布时间】:2012-02-08 23:23:55 【问题描述】:我知道你可以创建一个table and add a JTree as a column。但我想做的却完全相反。
检查图像并告诉我这是否可能。谢谢!
更新:
通过使用 MKorbel 的代码并使用以下代码随机化列数:
@Override
public int getColumnCount()
int i = (int) (Math.random( )* 10.0);
if (i%2 ==0)
return 2;
else
return 3;
我能够得到以下图像:
【问题讨论】:
我还没有测试过,但是为什么不可以呢。 API 请求渲染器返回一个组件。 JTable 是一个组件。在 JTable 中编辑/选择可能会更困难 @Robin 但我的意思是在视觉上,它合适吗?有什么困难吗? 现在这很有趣。我的 2 美分:我只是觉得如果你的桌子很大,你的树可能看起来有点时髦。另外,我很好奇你是否真的能够与桌子互动。会不会只是一张桌子的图片? @user489041 就我而言,我只是将它用作只读。但让它可编辑会很有趣,... 这个JTree with JTable in Node看起来和你的图片很像,放在那里JPanel --> JScrollPane --> JTable,是JTree可以编辑,然后你可以编辑Cell JTable 也是,+1 好问题 【参考方案1】:1) 我没有解决 isLeaf()
在 Renderer
和 Editor
不知何故
2) 如果我将JScrollPane
和JTable
直接放在Node
中,(不使用JPanel
作为parent
)然后JTree View
在start_up 后没有正确呈现有关更多信息,请参阅我的问题Put JTable in the JTree
import java.awt.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.tree.*;
public class TreeWithTableRenderer extends JFrame
private static final long serialVersionUID = 1L;
private JTree tree;
public TreeWithTableRenderer()
DefaultMutableTreeNode AA1 = new DefaultMutableTreeNode("AA1");
DefaultMutableTreeNode AA2 = new DefaultMutableTreeNode("AA2");
DefaultMutableTreeNode A = new DefaultMutableTreeNode("A");
A.add(AA1);
A.add(AA2);
DefaultMutableTreeNode BB1 = new DefaultMutableTreeNode("BB1");
DefaultMutableTreeNode BB2 = new DefaultMutableTreeNode("BB2");
DefaultMutableTreeNode B = new DefaultMutableTreeNode("B");
B.add(BB1);
B.add(BB2);
DefaultMutableTreeNode CC1 = new DefaultMutableTreeNode("CC1");
DefaultMutableTreeNode CC2 = new DefaultMutableTreeNode("CC2");
DefaultMutableTreeNode C = new DefaultMutableTreeNode("C");
C.add(CC1);
C.add(CC2);
DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
root.add(A);
root.add(B);
root.add(C);
tree = new JTree(root);
tree.setCellRenderer(new MyTableInTreeCellRenderer());
tree.setRowHeight(0);
JScrollPane jsp = new JScrollPane(tree);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(jsp, BorderLayout.CENTER);
pack();
setLocationRelativeTo(null);
class MyTableInTreeCellRenderer extends JPanel implements TreeCellRenderer
private static final long serialVersionUID = 1L;
private JTable table;
public MyTableInTreeCellRenderer()
super(new BorderLayout());
table = new JTable();
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane);
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus)
final String v = (String) ((DefaultMutableTreeNode) value).getUserObject();
table.setModel(new DefaultTableModel()
private static final long serialVersionUID = 1L;
@Override
public int getRowCount()
return 2;
@Override
public int getColumnCount()
return 2;
@Override
public Object getValueAt(int row, int column)
return v + ":" + row + ":" + column;
);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
return this;
public static void main(String[] args) throws Exception
SwingUtilities.invokeLater(new Runnable()
public void run()
new TreeWithTableRenderer().setVisible(true);
);
【讨论】:
感谢您的代码。我对其进行了一些修改以获得我的问题中的更新结果。我只是想知道我是否用最好的方法修改了什么? 但是表格不可编辑。如何编辑表格内容以上是关于Jtable 作为 Jtree 节点的主要内容,如果未能解决你的问题,请参考以下文章