初学java,如何把JTree组件添加到界面中?

初学java,如何把JTree组件添加到界面中?,第1张

/**

 * 把代码复制到文件,可以运行。

 */

import java.awt.BorderLayout

import java.awt.Color

import java.awt.Component

import java.awt.Font

import java.awt.Graphics

import java.awt.Graphics2D

import java.awt.Rectangle

import java.awt.Transparency

import java.awt.event.WindowAdapter

import java.awt.event.WindowEvent

import java.awt.image.BufferedImage

import javax.swing.Icon

import javax.swing.ImageIcon

import javax.swing.JDialog

import javax.swing.JLabel

import javax.swing.JPanel

import javax.swing.JScrollPane

import javax.swing.JTree

import javax.swing.UIManager

import javax.swing.tree.DefaultMutableTreeNode

import javax.swing.tree.TreeCellRenderer

/**

 *

 * @author beans

 */

public class TreeMain {

    public static void main(String[] args) {

        new TreeMain().showDialog()

    }

    public TreeMain() {

    }

    /**

     * 显示窗口

     */

    private void showDialog() {

        JDialog dialog = new JDialog()

        dialog.setBounds(new Rectangle(50, 50, 380, 280))

        dialog.setTitle("演示树")

        dialog.addWindowListener(new WindowAdapter() {

            @Override

            public void windowClosing(WindowEvent e) {

                dialog.setVisible(false)

                dialog.dispose()

            }

        })

        dialog.add(this.getPanel(), BorderLayout.CENTER)

        dialog.setVisible(true)

    }

    private JPanel getPanel() {

        JPanel panel = new JPanel()

        JScrollPane treePanel = new JScrollPane()

        treePanel.setViewportView(this.getTree())

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(panel)

        panel.setLayout(layout)

        layout.setHorizontalGroup(

                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

                .addGroup(layout.createSequentialGroup()

                        .addContainerGap()

                        .addComponent(treePanel, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)

                        .addContainerGap())

        )

        layout.setVerticalGroup(

                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

                .addGroup(layout.createSequentialGroup()

                        .addContainerGap()

                        .addComponent(treePanel, javax.swing.GroupLayout.PREFERRED_SIZE, 272, javax.swing.GroupLayout.PREFERRED_SIZE)

                        .addContainerGap(18, Short.MAX_VALUE))

        )

        panel.add(treePanel, BorderLayout.CENTER)

        return panel

    }

    /**

     * 取得树。

     *

     * @return

     */

    private JTree getTree() {

        DefaultMutableTreeNode root = new DefaultMutableTreeNode()

        root.add(this.getNode())

        root.add(this.getNode())

        root.add(this.getNode())

        JTree jtree = new JTree(root)

        jtree.setRootVisible(false)

        jtree.setCellRenderer(new CTreeCellRenderer())

        jtree.expandRow(1)

        return jtree

    }

    /**

     * 取得树节点

     *

     * @return

     */

    private DefaultMutableTreeNode getNode() {

        DefaultMutableTreeNode node = new DefaultMutableTreeNode(new NodeObject(true, "节"))

        for (int i = 0 i < 5 i++) {

            DefaultMutableTreeNode leaf = new DefaultMutableTreeNode(new NodeObject(false, "叶" + i))

            node.add(leaf)

        }

        return node

    }

    /**

     * 树节点和树叶,关联对象。

     */

    class NodeObject {

        boolean isNode

        String name

        /**

         *

         * @param isNode the value of isNode

         * @param name the value of name

         */

        NodeObject(boolean isNode, String name) {

            this.isNode = isNode

            this.name = name

        }

        /**

         * 图标

         *

         * @param isSelect 选中节点时返回不同的图标。

         * @return

         */

        ImageIcon getIcon(boolean isSelect) {

            int wh = 20

            BufferedImage image = new BufferedImage(wh, wh, BufferedImage.TYPE_INT_ARGB)

            Graphics2D g2 = image.createGraphics()

            image = g2.getDeviceConfiguration().createCompatibleImage(wh, wh, Transparency.TRANSLUCENT)

            Graphics2D g2d = image.createGraphics()

            Font font = new Font("Dialog", Font.PLAIN, wh - 4)

            g2d.setFont(font)

            g2d.setBackground(Color.WHITE)

            g2d.setColor(Color.BLACK)

            g2d.drawString(isSelect ? " S " : " N ", 0, wh - 1)

            g2d.setColor(this.isNode ? Color.RED : Color.YELLOW)

            g2d.drawLine(0, 5, wh, 5)

            g2d.drawLine(0, 10, wh, 10)

            g2d.drawLine(0, 15, wh, 15)

            g2d.dispose()

            g2.dispose()

            return new ImageIcon(image)

        }

        String getName() {

            return this.name

        }

    }

    /**

     * 树渲染器

     */

    protected class CTreeCellRenderer extends JLabel implements TreeCellRenderer {

        protected Color m_textSelectionColor

        protected Color m_textNonSelectionColor

        protected Color m_bkSelectionColor

        protected Color m_bkNonSelectionColor

        protected Color m_borderSelectionColor

        protected boolean m_selected

        public CTreeCellRenderer() {

            m_textSelectionColor = UIManager.getColor("Tree.selectionForeground")

            m_textNonSelectionColor = UIManager.getColor("Tree.textForeground")

            m_bkSelectionColor = UIManager.getColor("Tree.selectionBackground")

            m_bkNonSelectionColor = UIManager.getColor("Tree.textBackground")

            m_borderSelectionColor = UIManager.getColor("Tree.selectionBorderColor")

        }

        @Override

        public Component getTreeCellRendererComponent(JTree tree, Object value,

                boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {

            DefaultMutableTreeNode node = (DefaultMutableTreeNode) value

            NodeObject obj = (NodeObject) node.getUserObject()

            this.setIcon(obj.getIcon(selected))

            this.setText("  " + obj.getName() + " ")

            this.setForeground(selected ? m_textSelectionColor : m_textNonSelectionColor)

            this.setBackground(selected ? m_bkSelectionColor : m_bkNonSelectionColor)

            this.m_selected = selected

            return this

        }

        @Override

        public void paint(Graphics g) {

            Color bColor = this.getBackground()

            Icon icon = this.getIcon()

            g.setColor(bColor)

            int offset = 0

            if (icon != null && getText() != null) {

                offset = (icon.getIconWidth() + this.getIconTextGap())

            }

            g.fillRect(offset, 0, this.getWidth() - 1 - offset, this.getHeight() - 1)

            if (this.m_selected) {

                g.setColor(this.m_borderSelectionColor)

                g.drawRect(offset, 0, this.getWidth() - 1 - offset, this.getHeight() - 1)

            }

            super.paint(g)

        }

    }

}

include<stdio.h>int main()

{ int N,r

long double sum=0

long double a,b

scanf("%d",&N)

for(r=0r<Nr++){

scanf("%lf%lf",&a,&b)

JTree组件被用来以树的形式显示数据,一层套一层,看起来清晰明了,使用户很方便地就了解到各个节点之间的层次关系,可以很容易地找到相关的数据。

例如 Windows 系统的文件管理器,它就是一个典型的树层次结构。

JTree的构造函数:

·JTree() 建立一棵默认的树。

·JTree(Hashtable data) 利用Hashtable建立树。

·JTree(Object[] data) 利用数组建立树。

·JTree(TreeModel model) 利用TreeModel建立树。

·JTree(TreeNode root) 建立以root为根的树。

·JTree(TreeNode root,Boolean children) 建立以 root 为根的树,并设定是否允许有子节点。

·JTree(Vector value) 利用Vector建立树。

使用一个JTree可以简单地像下面这样表示:

import javax.swing.JFrame

import javax.swing.JTree

import javax.swing.event.TreeSelectionEvent

import javax.swing.event.TreeSelectionListener

import javax.swing.tree.DefaultMutableTreeNode

 

public class TreeDemo {

    public static void main(String[] args) {

 

        // 创建没有父节点和子节点、但允许有子节点的树节点,并使用指定的用户对象对它进行初始化。

        // public DefaultMutableTreeNode(Object userObject)

        DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("软件部")

        node1.add(new DefaultMutableTreeNode(new User("小花")))

        node1.add(new DefaultMutableTreeNode(new User("小虎")))

        node1.add(new DefaultMutableTreeNode(new User("小龙")))

 

        DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("销售部")

        node2.add(new DefaultMutableTreeNode(new User("小叶")))

        node2.add(new DefaultMutableTreeNode(new User("小雯")))

        node2.add(new DefaultMutableTreeNode(new User("小夏")))

 

        DefaultMutableTreeNode top = new DefaultMutableTreeNode("职员管理")

 

        top.add(new DefaultMutableTreeNode(new User("总经理")))

        top.add(node1)

        top.add(node2)

        final JTree tree = new JTree(top)

        JFrame f = new JFrame("JTreeDemo")

        f.add(tree)

        f.setSize(300, 300)

        f.setVisible(true)

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

        // 添加选择事件

        tree.addTreeSelectionListener(new TreeSelectionListener() {

 

            @Override

            public void valueChanged(TreeSelectionEvent e) {

                DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree

                        .getLastSelectedPathComponent()

 

                if (node == null)

                    return

 

                Object object = node.getUserObject()

                if (node.isLeaf()) {

                    User user = (User) object

                    System.out.println("你选择了:" + user.toString())

                }

 

            }

        })

    }

}

 

class User {

    private String name

 

    public User(String n) {

        name = n

    }

 

    // 重点在toString,节点的显示文本就是toString

    public String toString() {

        return name

    }

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11879826.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存