Jtable作为Jtree节点 [英] Jtable as a Jtree Node
本文介绍了Jtable作为Jtree节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我知道您可以创建
import java.awt。*;
import javax.swing。*;
import javax.swing.table.DefaultTableModel;
import javax.swing.tree。*;
公共类TreeWithTableRenderer扩展JFrame {
private static final long serialVersionUID = 1L;
私有JTree树;
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);
}
类MyTableInTreeCellRenderer扩展JPanel实现TreeCellRenderer {
private static final long serialVersionUID = 1L;
私有JTable表;
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(){
返回2;
}
@Override
public int getColumnCount(){
返回2;
}
@Override
public Object getValueAt(int row,int column){
return v +:+ row +:+ column;
}
});
table.setPreferredScrollableViewportSize(table.getPreferredSize());
返回此;
}
}
public static void main(String [] args)抛出异常{
SwingUtilities.invokeLater(new Runnable(){
public void run(){
new TreeWithTableRenderer()。setVisible(true);
}
});
}
}
I know you can create a table and add a JTree as a column. But what I want to do is the complete opposite.
Check the image and tell me if this is possible. Thanks!
UPDATE:
By using MKorbel's code and by randomizing the number of columns with the following code:
@Override
public int getColumnCount() {
int i = (int) (Math.random( )* 10.0);
if (i%2 ==0)
return 2;
else
return 3;
}
I was able to get the following image:
解决方案
1) I didn't solve isLeaf()
in Renderer
and Editor
somehow
2) if I put JScrollPane
with JTable
to the Node
directly, (without using JPanel
as parent
) then JTree View
isn't correctly rendered after start_up for more info please see my question 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节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文