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

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

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

    Swing自定義組件: JCheckTree

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

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



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

    從類名可以看出來. CheckTreeDemo是JFrame類 CheckTree是組件,Node是數(shù)據(jù)模型,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

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

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

    <2011年8月>
    31123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    導航

    統(tǒng)計

    公告

    不顯示applet

    常用鏈接

    留言簿(16)

    我參與的團隊

    隨筆檔案

    文章分類

    文章檔案

    新聞檔案

    相冊

    swingchina 專業(yè)搞Swing的網(wǎng)站

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 全黄大全大色全免费大片| 人妻视频一区二区三区免费| 精品亚洲麻豆1区2区3区| 无码精品A∨在线观看免费| 美女被羞羞网站免费下载| 亚洲av无码乱码国产精品fc2| 毛片在线免费视频| 国产免费AV片在线观看| 亚洲精品日韩一区二区小说| 亚洲熟妇无码乱子AV电影| 四虎永久在线观看免费网站网址| 国产成人不卡亚洲精品91| 亚洲成年轻人电影网站www| 日日操夜夜操免费视频| 久久99精品国产免费观看| 瑟瑟网站免费网站入口| 亚洲激情黄色小说| 91麻豆精品国产自产在线观看亚洲| 69av免费视频| 国产精品青草视频免费播放| 亚洲影视自拍揄拍愉拍| 亚洲精品亚洲人成人网| 四虎成人精品一区二区免费网站| 插鸡网站在线播放免费观看| 亚洲日韩国产二区无码| 亚洲精品国产啊女成拍色拍| 国产日产亚洲系列| 国产精品视频免费一区二区三区| 91香蕉国产线观看免费全集| 一级特黄录像视频免费| 亚洲国产精品一区二区三区在线观看| 亚洲AV午夜成人片| 国产亚洲精品a在线观看| 破了亲妺妺的处免费视频国产| 99久久99热精品免费观看国产| 久久精品成人免费国产片小草 | 国产精品亚洲一区二区三区在线观看| 亚洲高清视频免费| 亚洲高清在线视频| 亚洲女同成av人片在线观看| 亚洲国产中文字幕在线观看|