现在的位置: 首页 > 综合 > 正文

JTree及JTable学习,在JTree中嵌套JTable的例子。

2012年01月20日 ⁄ 综合 ⁄ 共 3644字 ⁄ 字号 评论关闭

想做一个参数配置界面,需要进行树状管理。想要将参数作为叶子几点进行配置。看来下书上的介绍。

也找网上的相关文章参考了一下。效果基本是出来了,但是实际使用感受不理想。想要修改参数时很难用。

如有那位肯不吝指教,非常感谢~微笑

效果图如下:

代码如下:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tree;

import java.awt.Component;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTree;
import javax.swing.table.AbstractTableModel;
import javax.swing.tree.*;

/**
 *
 * @author HuFeiyan
 */
public class JTableTree extends JScrollPane {

    public static void main(String[] args) {
        JFrame frame = new JFrame("TreeTableSample");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JTableTree tree = new JTableTree();
        frame.add(tree);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public JTableTree() {
        TreeNode rootNode = createNodes();
        tree = new JTree(rootNode);
        tree.setCellRenderer(new TreeTableCellRenderer());
        tree.setCellEditor(new TreeTableCellEditor(tree, new DefaultTreeCellRenderer()));
        tree.setEditable(true);
        setViewportView(tree);
    }

    private TreeNode createNodes() {
        DefaultMutableTreeNode root;
        DefaultMutableTreeNode grandparent;
        DefaultMutableTreeNode parent;
        DefaultMutableTreeNode child;

        root = new DefaultMutableTreeNode("Link Set");

        grandparent = new DefaultMutableTreeNode("Diameter");
        root.add(grandparent);
        //
        MyData ud1 = new MyData(new String[][]{{"L1P1", "L1V1"}, {"L1P2", "L1V2"}, {"L1P3", "L1V3"}});
        MyTableModel m1 = new MyTableModel(ud1.getData());
        JTable t1 = new JTable(m1);
        child = new DefaultMutableTreeNode(t1);
        parent = new DefaultMutableTreeNode(ud1);
        parent.add(child);
        grandparent.add(parent);

        MyData ud2 = new MyData(new String[][]{{"L2P1", "L2V1"}, {"L2P2", "L2V2"}, {"L2P3", "L2V3"}});
        MyTableModel m2 = new MyTableModel(ud2.getData());
        JTable t2 = new JTable(m2);
        child = new DefaultMutableTreeNode(t1);
        parent = new DefaultMutableTreeNode(ud2);
        parent.add(child);
        grandparent.add(parent);

        return root;
    }
    public JTree tree;
    public JTable cellTable;
}

class MyData {

    String[][] data;

    public MyData(String[][] object) {
        data = object;
    }

    @Override
    public String toString() {
        String result = "";
        for (String[] a : data) {
            result += "[";
            for (String b : a) {
                result += b;
            }
            result += "]";
        }
        return result;
    }

    public String[][] getData() {
        return data;
    }
}

class MyTableModel extends AbstractTableModel {

    private Object[][] data;

    public MyTableModel(String[][] data) {
        this.data = data;
    }

    @Override
    public int getColumnCount() {
        return 2;
    }

    @Override
    public int getRowCount() {
        return data.length;
    }

    @Override
    public Object getValueAt(int row, int col) {
        return data[row][col];
    }

    @Override
    public boolean isCellEditable(int row, int col) {
        if (col < 1) {
            return false;
        } else {
            return true;
        }
    }

    @Override
    public void setValueAt(Object value, int row, int col) {
        data[row][col] = value;
        fireTableCellUpdated(row, col);
    }
}

class TreeTableCellRenderer extends DefaultTreeCellRenderer {

    JTable table;

    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
        Object ud = node.getUserObject();

        if (!(ud instanceof JTable) || !leaf) {
            System.out.println(ud);
            return super.getTreeCellRendererComponent(tree, value, leaf, expanded, leaf, row, hasFocus);
        }
        return (JTable) ud;
    }
}

class TreeTableCellEditor extends DefaultTreeCellEditor {

    JTable table;

    @Override
    public Component getTreeCellEditorComponent(JTree tree,
            Object value,
            boolean isSelected,
            boolean expanded,
            boolean leaf,
            int row) {
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
        Object ud = node.getUserObject();
        if (!(ud instanceof JTable) || !leaf) {
            System.out.println(ud);
            return super.getTreeCellEditorComponent(tree, value, isSelected, expanded, leaf, row);
        }
        return (JTable) ud;
    }

    public TreeTableCellEditor(JTree tree, DefaultTreeCellRenderer renderer, TreeCellEditor editor) {
        super(tree, renderer, editor);
    }

    public TreeTableCellEditor(JTree tree, DefaultTreeCellRenderer renderer) {
        super(tree, renderer);
    }
}

抱歉!评论已关闭.