<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Swing自定義組件: JCheckTree

    今天有一美女..說想要帶JCheckBox的JTree.其實想一想..沒什么不好實現的.
    一個Renderer 一個Listener 應該可以搞定.. 自定義組件..關鍵就在交互事件上..
    |----------------------------------------------------------------------------------------|
                         版權聲明  版權所有 @chensiyu
                引用請注明來源 
    www.tkk7.com/chensiyu04

                本文由  陳思羽 于 2011年8月24號 出品..
    |----------------------------------------------------------------------------------------|



    4個類.分別為:CheckTreeDemo,CheckTree,Node,CheckRenderer,CheckListener

    從類名可以看出來. CheckTreeDemo是JFrame類 CheckTree是組件,Node是數據模型,CheckRenderer是CheckTree得渲染,CheckListener是CheckTree的事件


    package tree;

    import java.awt.BorderLayout;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;

    /**
     *
     * 
    @author chensiyu
     * @createDate 2011/8/24
     
    */
    public class CheckTreeDemo extends JPanel {

        
    private CheckTree checkTree;
        
        
    public CheckTreeDemo() {
            init();
        }
        
        
    private void init(){
            setLayout(
    new BorderLayout());
            
            Node rootNode 
    = new Node("Root");
            Node []nodes 
    = new Node[10];
            
    for(int i = 0;i <nodes.length;i++){
                Node node 
    = new Node("Node-"+i);
                rootNode.add(node);
            }
            checkTree 
    = new CheckTree(rootNode);
            add(checkTree,BorderLayout.CENTER);
            
        }

        
    public static void main(String[] args) {
            
    final JFrame frame = new JFrame();
            frame.setTitle(
    "CheckTree");
            frame.setLayout(
    new BorderLayout());
            frame.setSize(
    200400);
            frame.getContentPane().add(
    new CheckTreeDemo());
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            SwingUtilities.invokeLater(
    new Runnable() {

                @Override
                
    public void run() {
                    frame.setVisible(
    true);
                }
            });
        }
    }


    package tree;

    import javax.swing.JTree;
    import javax.swing.tree.TreeNode;

    /**
     *
     * 
    @author chensiyu
     * @createDate 2011/8/24
     
    */
    public class CheckTree extends JTree {

        
    private CheckRenderer checkRenderer;
        
    private CheckListener checkListener;

        
    public CheckTree() {
            init();
        }

        
    public CheckTree(TreeNode node) {
            
    super(node);
            init();
        }

        
    private void init() {
            checkRenderer 
    = new CheckRenderer();
            checkListener 
    = new CheckListener();
            setCellRenderer(checkRenderer);
            addMouseListener(checkListener);
        }
    }

    package tree;

    import javax.swing.tree.DefaultMutableTreeNode;

    /**
     *
     * 
    @author chensiyu
     * @createDate 2011/8/24
     
    */
    public class Node extends DefaultMutableTreeNode{

        
    private String name = "";
        
    private boolean selected = false;

        
    public Node(String name){
            
    super(name);
            setName(name);
        }
        
    public String getName() {
            
    return name;
        }

        
    public void setName(String name) {
            
    this.name = name;
        }

        
    public boolean isSelected() {
            
    return selected;
        }

        
    public void setSelected(boolean selected) {
            
    this.selected = selected;
        }
    }

    package tree;

    /**
     *
     * 
    @author chensiyu
     * @createDate 2011/8/24
     
    */
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.tree.*;

    class CheckRenderer extends JPanel implements TreeCellRenderer {

        
    protected static JCheckBox check;
        
    protected JLabel label;
        
    private static Rectangle checkBounds;

        
    public CheckRenderer() {
            setLayout(
    null);
            add(check 
    = new JCheckBox());
            add(label 
    = new JLabel(""));
            check.setBackground(UIManager.getColor(
    "Tree.textBackground"));
            label.setForeground(UIManager.getColor(
    "Tree.textForeground"));
        }

        @Override
        
    public Component getTreeCellRendererComponent(JTree tree, Object value,
                
    boolean isSelected, boolean expanded, boolean leaf, int row,
                
    boolean hasFocus) {
            String stringValue 
    = tree.convertValueToText(value, isSelected,
                    expanded, leaf, row, hasFocus);
            setEnabled(tree.isEnabled());
            label.setFont(tree.getFont());
            label.setText(stringValue);
            setBackground(tree.getBackground());
            setForeground(tree.getForeground());
            
            
    if(value instanceof Node){
                Node node 
    = (Node)value;
                check.setSelected(node.isSelected());
            }
            
    return this;
        }

        @Override
        
    public Dimension getPreferredSize() {
            Dimension d_check 
    = check.getPreferredSize();
            Dimension d_label 
    = label.getPreferredSize();
            
    return new Dimension(d_check.width + d_label.width,
                    (d_check.height 
    < d_label.height ? d_label.height
                    : d_check.height));
        }

        @Override
        
    public void doLayout() {
            Dimension d_check 
    = check.getPreferredSize();
            Dimension d_label 
    = label.getPreferredSize();
            
    int y_check = 0;
            
    int y_label = 0;
            
    if (d_check.height < d_label.height) {
                y_check 
    = (d_label.height - d_check.height) / 2;
            } 
    else {
                y_label 
    = (d_check.height - d_label.height) / 2;
            }
            check.setLocation(
    0, y_check);
            check.setBounds(
    0, y_check, d_check.width, d_check.height);
            label.setLocation(d_check.width, y_label);
            label.setBounds(d_check.width, y_label, d_label.width, d_label.height);
            
    if (checkBounds == null){
                checkBounds 
    = check.getBounds();
            }
                    
        }
        
        
    public static Rectangle getCheckBoxRectangle() {
            
    ifnull == checkBounds )
                
    return new Rectangle(0,0,0,0);
            
    return (Rectangle) checkBounds.clone();
        }
    }

    package tree;

    import java.awt.Point;
    import java.awt.Rectangle;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import javax.swing.JTree;
    import javax.swing.tree.TreePath;

    /**
     *
     * 
    @author chensiyu
     * @createDate 2011/8/24
     
    */
    class CheckListener extends MouseAdapter {

        
    public CheckListener() {
        }

        @Override
        
    public void mouseClicked(MouseEvent e) {
            JTree tree 
    = (JTree) e.getSource();
            Point p 
    = e.getPoint();
            
    int x = e.getX();
            
    int y = e.getY();
            
    int row = tree.getRowForLocation(x, y);
            TreePath path 
    = tree.getPathForRow(row);

            
    if (null == path) {
                
    return;
            }

            Object component 
    = path.getLastPathComponent();
            
    if (null == component) {
                
    return;
            }

            
    if (component instanceof Node) {
                Rectangle chRect 
    = CheckRenderer.getCheckBoxRectangle();
                Rectangle rowRect 
    = tree.getPathBounds(path);
                chRect.setLocation(chRect.x 
    + rowRect.x, chRect.y + rowRect.y);
                
    if (e.getClickCount() == 1 && chRect.contains(p)) {
                    Node node 
    = (Node)component;
                    node.setSelected(
    !node.isSelected());
                    tree.repaint();
                }
            }
        }
    }

    posted on 2011-08-24 18:08 相信 閱讀(2242) 評論(2)  編輯  收藏 所屬分類: Swing文章

    評論

    # re: Swing自定義組件: JCheckTree[未登錄] 2011-08-25 08:43 greatghoul

    請問為什么要這樣做,而不是直接frame.setVisible(true)呢?
    SwingUtilities.invokeLater(new Runnable() {

    @Override
    public void run() {
    frame.setVisible(true);
    }
    });  回復  更多評論   

    # re: Swing自定義組件: JCheckTree 2011-08-25 09:57 相信

    @greatghoul

    關于這個問題.你可以參考 JDK API 里 關于 Swing 的線程策略 .

    簡單的說.
    通常 Swing 不是線程安全的。除非另行說明,否則所有 Swing 組件及相關類都必須在事件調度線程上訪問。  回復  更多評論   

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    公告

    不顯示applet

    常用鏈接

    留言簿(16)

    我參與的團隊

    隨筆檔案

    文章分類

    文章檔案

    新聞檔案

    相冊

    swingchina 專業搞Swing的網站

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 日本午夜免费福利视频| 无码AV动漫精品一区二区免费| 久久精品免费一区二区喷潮 | 亚洲成熟xxxxx电影| a成人毛片免费观看| 亚洲欧洲日本在线| 一级毛片免费播放试看60分钟 | 亚洲成AV人片在线观看无码| 亚洲宅男天堂a在线| 亚洲人片在线观看天堂无码| 成年女人18级毛片毛片免费 | 无码 免费 国产在线观看91| 亚洲人成影院在线无码按摩店| 亚洲毛片基地4455ww| 九九热久久免费视频| 亚洲日产无码中文字幕| 国产免费无码一区二区| 内射少妇36P亚洲区| 无码人妻久久一区二区三区免费丨| 亚洲1234区乱码| 免费在线观看污网站| 亚洲人成网站日本片| 特级淫片国产免费高清视频| 日本一区二区三区在线视频观看免费 | 亚洲国产美女在线观看| 成人网站免费观看| 男男黄GAY片免费网站WWW| 97人妻无码一区二区精品免费| 国产AⅤ无码专区亚洲AV| 亚洲AV无码片一区二区三区| 国产一卡2卡3卡4卡无卡免费视频 国产一卡二卡3卡四卡免费 | 最近中文字幕免费完整| 最新亚洲卡一卡二卡三新区| 亚洲免费网站在线观看| 亚洲精品无码专区在线播放| 国产精品亚洲综合一区| 免费成人福利视频| 一级毛片视频免费观看| 亚洲大香伊人蕉在人依线| 免费午夜爽爽爽WWW视频十八禁 | 国产啪亚洲国产精品无码 |