数据库的一张父子表(就是一张表中有id和父id的那种)有没有好的办法通过Swing的jtree展现出来?有代码最好,多谢了

解决方案 »

  1.   

    package nc.ui.mte.medicalexp;
    import javax.swing.*;import java.awt.*;
    import java.awt.event.*;
    import javax.swing.tree.*;
    import javax.swing.event.*;
    import javax.swing.border.*;
    import javax.swing.table.*;/** 
     * Swing 组件测试程序
     * 测试Swing所有组件及其相应的事件
     */
    public class SwingTest extends JFrame
    {
    /**
     * 主模块,初始化所有子模块,并设置主框架的相关属性
     */
    public SwingTest()
    {
    // 初始化所有模块
    MenuTest menuTest = new MenuTest();
    LeftPanel leftPanel = new LeftPanel();
    RightPanel rightPanel = new RightPanel();
    BottomPanel bottomPanel = new BottomPanel();
    CenterPanel centerPanel = new CenterPanel();

    // 设置主框架的布局
    Container c = this.getContentPane();
        // c.setLayout(new BorderLayout())
    this.setJMenuBar(menuTest);

    c.add(leftPanel,BorderLayout.WEST);
    c.add(rightPanel,BorderLayout.EAST);
    c.add(centerPanel,BorderLayout.CENTER);
    c.add(bottomPanel,BorderLayout.SOUTH);

    // 利用无名内隐类,增加窗口事件
    this.addWindowListener(new WindowAdapter()
    {
    public void WindowClosing(WindowEvent e)
    {   
        // 释放资源,退出程序
    dispose();
    System.exit(0);
    }
    });



    setSize(700,500);
    setTitle("Swing 组件大全简体版");
    // 隐藏frame的标题栏,此功暂时关闭,以方便使用window事件
    // setUndecorated(true);
    setLocation(200,150);
    show();
    } ////////////////////////////////////////////////////////////////////////////
    /**
     * 菜单栏处理模块
     * JMenuBar --+
     *            --JMenu--+
     *                    --JMenuItem  --ActionListener 
     *              
     */
    class MenuTest extends JMenuBar
    {
    private JDialog aboutDialog;

    /**
     * 菜单初始化操作
     */
    public MenuTest()
    {
    JMenu fileMenu = new JMenu("文件");
    JMenuItem exitMenuItem = new JMenuItem("退出",KeyEvent.VK_E);
    JMenuItem aboutMenuItem = new JMenuItem("关于...",KeyEvent.VK_A);

    fileMenu.add(exitMenuItem);
    fileMenu.add(aboutMenuItem);

    this.add(fileMenu);


    aboutDialog = new JDialog();
    initAboutDialog();

    // 菜单事件
    exitMenuItem.addActionListener(new ActionListener()
    {
    public void actionPerformed(ActionEvent e)
    {
    dispose();
    System.exit(0);
    }
    });

    aboutMenuItem.addActionListener(new ActionListener()
    {
    public void actionPerformed(ActionEvent e)
    {
    // "关于"对话框的处理
    aboutDialog.show();
    }
    });

    }

    /**
     * 返回关于对话框
     */
    public JDialog getAboutDialog()
    {
    return aboutDialog;
    }

    /**
     * 设置"关于"对话框的外观及响应事件,操作和JFrame一样都是在内容
     * 框架上进行的
     */
    public void initAboutDialog()
    {
    aboutDialog.setTitle("关于");

    Container con =aboutDialog.getContentPane();
     
    // Swing 中使用html语句
    Icon icon = new ImageIcon("smile.gif");
    JLabel aboutLabel = new JLabel("<html><b><font size=5>"+
    "<center>Swing 组件大全简体版!"+"<br>天翼.李",icon,JLabel.CENTER);

    //JLabel aboutLabel = new JLabel("Swing 组件大全简体版!",icon,JLabel.CENTER);
    con.add(aboutLabel,BorderLayout.CENTER);

    aboutDialog.setSize(450,225);
    aboutDialog.setLocation(300,300);
    aboutDialog.addWindowListener(new WindowAdapter()
    {
    public void WindowClosing(WindowEvent e)
    {
    dispose();
    }
    });
    }
    }

    ////////////////////////////////////////////////////////////////////////////
    /**
     * 最左边模块,继承JPanel,初始化内容为JTree
     * JPanel--+
     *         --JTree
     */
    class LeftPanel extends JPanel
    {
    private int i = 0;
    public LeftPanel()
    {

    DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
    DefaultMutableTreeNode child = new DefaultMutableTreeNode("Child");
    DefaultMutableTreeNode select = new DefaultMutableTreeNode("select");

    DefaultMutableTreeNode child1 = new DefaultMutableTreeNode(""+i);

    root.add(child);
    root.add(select);
    child.add(child1);

    JTree tree = new JTree(root);
    tree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);

    // 每个节点的行高
    tree.setRowHeight(20);
    tree.addTreeSelectionListener(new TreeSelectionListener ()
    {
    public void valueChanged(TreeSelectionEvent e)
    {
    // 内隐类不能直接引用外部类tree,1.外部变量可申明为final 2.新建外部类的对象
    JTree tree =(JTree)e.getSource();
    DefaultMutableTreeNode selectNode = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
    i++;
    selectNode.add(new DefaultMutableTreeNode(""+i));
    }
    });

    tree.setPreferredSize(new Dimension(100,300));
    // tree.setEnabled(true);
    JScrollPane scrollPane = new JScrollPane(tree);
    //scrollPane.setSize(100,350);
    this.add(scrollPane);
    }
    }

    ////////////////////////////////////////////////////////////////////////////
    /**
     * 最下面层模块,继承JPanel,初始化内容为进度条,并由定时器控制
     * JPanel--+
     *         --JProcessBar  --Timer
     */
    class BottomPanel extends JPanel
    {
    private JProgressBar pb;
    public BottomPanel()
    {
    pb = new JProgressBar();
    pb.setPreferredSize(new Dimension(680,20));

    // 设置定时器,用来控制进度条的处理
    Timer time = new Timer(1,new ActionListener()

        int counter = 0;
    public void actionPerformed(ActionEvent e)
    {
    counter++;
    pb.setValue(counter);
    Timer t = (Timer)e.getSource();

    // 如果进度条达到最大值重新开发计数
    if (counter == pb.getMaximum())
    {
    t.stop();
    counter =0;
    t.start();
    }
    }
    });
    time.start();

    pb.setStringPainted(true);
    pb.setMinimum(0);
    pb.setMaximum(1000);
    pb.setBackground(Color.white);
    pb.setForeground(Color.red);

    this.add(pb);
    }

    /**
     * 设置进度条的数据模型
     */
    public void setProcessBar(BoundedRangeModel rangeModel)
    {
    pb.setModel(rangeModel);
    }
    }

    ////////////////////////////////////////////////////////////////////////////
    /**
     * 最右边模块,继承JPanel,初始化各种按钮
     * JPanel--+
     *         --JButton  --JToggleButton -- JList -- JCombox --JCheckBox ....
     */
    class RightPanel extends JPanel
    {
    public RightPanel()
    {
    this.setLayout(new GridLayout(8,1));


    // 初始化各种按钮
    JCheckBox checkBox = new JCheckBox("复选按钮");
    JButton button = new JButton("打开文件");
    button.addActionListener(new ActionListener()
    {
    public void actionPerformed(ActionEvent e)
    {
    JFileChooser file = new JFileChooser();
    int result = file.showOpenDialog(new JPanel());
    if (result ==file.APPROVE_OPTION) 
    {
    String fileName = file.getSelectedFile().getName();
    String dir = file.getCurrentDirectory().toString();
       JOptionPane.showConfirmDialog(null,dir+"\\"+fileName,"选择的文件",JOptionPane.YES_OPTION);
     }
    }
    });

    JToggleButton toggleButton = new JToggleButton("双态按钮");

    ButtonGroup buttonGroup = new ButtonGroup();
    JRadioButton radioButton1 = new JRadioButton("单选按钮1",false);
    JRadioButton radioButton2 = new JRadioButton("单选按钮2",false);

    // 组合框的处理
    JComboBox comboBox = new JComboBox();
    comboBox.setToolTipText("点击下拉列表增加选项");
    comboBox.addActionListener(new ActionListener() 
    {
    public void actionPerformed(ActionEvent e)
    {
    JComboBox comboBox =(JComboBox)e.getSource();
    comboBox.addItem("程序员");
    comboBox.addItem("分析员");
    }
    });

    // 列表框的处理
    DefaultListModel litem = new DefaultListModel();
    litem.addElement("香蕉");
    litem.addElement("水果");
    JList list = new JList(litem);


    list.addListSelectionListener(new ListSelectionListener ()
    {
    public void valueChanged(ListSelectionEvent e)
    {
    JList l = (JList)e.getSource();
    Object s= l.getSelectedValue();
    JOptionPane.showMessageDialog(null,s,"消息框",JOptionPane.YES_OPTION);
    }
    });

    // 增加按钮组
    buttonGroup.add(radioButton1);
    buttonGroup.add(radioButton2);

    // 增加各种按钮到JPanel中显示
    add(button);
    add(toggleButton);
    add(checkBox);
    add(radioButton1);
    add(radioButton2);
    add(comboBox);

    add(list);

    this.setBorder(new EtchedBorder(EtchedBorder.LOWERED,Color.LIGHT_GRAY,Color.blue));
    }
    }

      

  2.   

    ////////////////////////////////////////////////////////////////////////////
    /**
     * 中间层模块,继承JPanel,初始化页签,并在页签中设置文本区,表格,
     * 文本区上下用分隔条分隔
     * JPanel--+
     *         -JTabbedPane--+
     *               --Draw --JTable  -JTextAreas -JText --JPopupMenu
     */
    class CenterPanel extends JPanel
    {
    public CenterPanel()
    {
    JTabbedPane tab = new JTabbedPane(JTabbedPane.TOP);

    JTextField textField = new JTextField("文本域,点击打开<文件按钮>可选择文件");
    textField.setActionCommand("textField");

    JTextPane textPane = new JTextPane();
    textPane.setCursor(new Cursor(Cursor.TEXT_CURSOR));
    textPane.setText("编辑器,试着点击文本区,试着拉动分隔条。");

    textPane.addMouseListener(new MouseAdapter () 
    {
    public void mousePressed (MouseEvent e)
    {
    JTextPane textPane = (JTextPane)e.getSource();
    textPane.setText("编辑器点击命令成功");
    // textField.setText(""+textPane.getText());
    }
    });

    /*
    UpperCaseDocument doc = new Document(); 
    textField.setDocumentsetDocument(doc);
    doc.addDocumentListener(new DocumentListener()
    {
    public void changedUpdate(DocumentEvent e){}
    public void removeUpdate(DocumentEvent e){}
    public void insertUpdate(DocumentEvent e)
    {
    Document text = (Document)e.getDocument();
    text.setText("复制成功");
    }
    });
    */

    JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,textField,textPane);


    JTable table = new JTable(10,10);
    //table.showHorizontalLines(true);
    //table.showVerticalLines(true);
    //table.gridColor(Color.blue);

    JPanel pane  = new JPanel();
    pane.add(table.getTableHeader(),BorderLayout.NORTH);
    pane.add(table);

    tab.addTab("文本演示",splitPane);
    //tab.addTab(table.getTableHeader());
    tab.addTab("表格演示",pane);
    tab.setPreferredSize(new Dimension(500,600));
    this.add(tab);
    this.setEnabled(true);
    }
    }


    public static void main(String args[])
    {
    // 设置主框架属性,此处没有使用,可打开看看效果
    //try
    //{
    // UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    //}
    //catch  (Exception e){}
    new SwingTest();
    }
    }