節點可以編輯

// DisabledNodeTreeExample.java
/* (swing1.1.1beta2) swing#1331 */
//package jp.gr.java_conf.tame.swing.examples;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;
import javax.swing.border.*;
import jp.gr.java_conf.tame.swing.icon.*;
import jp.gr.java_conf.tame.swing.tree.*;

/**
 * @version 1.1 04/30/99
 */
public class DisabledNodeTreeExample extends JFrame {
  public DisabledNodeTreeExample() {
    super("DisabledNode TreeExample");
    
    String[] strs = {"swing",     // 0
		     "plaf",      // 1
		     "basic",     // 2
		     "metal",     // 3
		     "JTree",     // 4
		     "plaf",      // 5
		     "motif"};    // 6
                                             
    DisabledNode[] nodes = new DisabledNode[strs.length];
    for (int i=0;i<strs.length;i++) {
      nodes[i] = new DisabledNode(strs[i]); 
    }
    nodes[0].add(nodes[1]);
    nodes[1].add(nodes[2]);
    nodes[1].add(nodes[3]);
    nodes[0].add(nodes[4]);
    nodes[0].add(nodes[5]);
    nodes[5].add(nodes[6]);
    nodes[3].setEnabled(false);
    nodes[5].setEnabled(false);
    
    final JTree tree = new JTree( nodes[0] ) {
      public boolean isPathEditable(TreePath path) {
        DisabledNode node = (DisabledNode)path.getLastPathComponent();
        if (node.isEnabled()) {
          return isEditable();
        } else {
          return false;
        }
      }     
    };
    
    DisabledRenderer renderer = new DisabledRenderer();
    renderer.setDisabledLeafIcon(new DisabledLeafIcon());
    renderer.setDisabledOpenIcon(new DisabledFolderIcon());
    renderer.setDisabledClosedIcon(new DisabledFolderIcon());
    tree.setCellRenderer(renderer);
    tree.setEditable(true);
    
    JScrollPane sp = new JScrollPane(tree);    
    ButtonPanel bp = new ButtonPanel(tree);
    getContentPane().add(sp, BorderLayout.CENTER);
    getContentPane().add(bp, BorderLayout.EAST);
  }
   
  class ButtonPanel extends JPanel {
    JTree tree;
    DefaultTreeModel model;
    
    ButtonPanel(JTree tree) {
      this.tree = tree;
      model = (DefaultTreeModel)tree.getModel();
      setLayout(new GridLayout(2,1));
      setBorder(new TitledBorder("Change Node"));
      JButton enabledButton  = new JButton("Enabled");
      JButton disabledButton = new JButton("Disabled");
      add(enabledButton);
      add(disabledButton);
      enabledButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          setNodeEnabled( true  );
        }
      });
      disabledButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          setNodeEnabled( false );
        }
      });
    }
    
    private void setNodeEnabled(boolean enabled) {
      TreePath[] path = tree.getSelectionPaths();
      if (path == null) return;
      DisabledNode node = null;
      for (int i=0;i<path.length;i++) {
        node = (DisabledNode)path[i].getLastPathComponent();
        //if (node.isRoot()) {
        //  System.out.println("refused: root node");
        //} else {
          int beforeChildCount = node.getChildCount();
          node.setEnabled(enabled);
          int afterChildCount  = node.getChildCount();
          if (beforeChildCount == afterChildCount) {
            model.nodeChanged(node);
          } else {
            model.reload();
          }
        //}
      }
    }
  }

  public static void main(String args[]) {
    DisabledNodeTreeExample frame = new DisabledNodeTreeExample();
    frame.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {System.exit(0);}
    });
    frame.setSize(300, 180);
    frame.setVisible(true);
  }
}
==========================================================
// DisabledRenderer.java
/* (swing1.1.1beta2) */ 
package jp.gr.java_conf.tame.swing.tree;

import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;
import jp.gr.java_conf.tame.swing.icon.*;


/**
 * @version 1.1 04/30/99
 */
public class DisabledRenderer extends DefaultTreeCellRenderer {
  protected Icon disabledLeafIcon;
  protected Icon disabledOpenIcon;
  protected Icon disabledClosedIcon;
    
  public DisabledRenderer() {
    this( new GraydIcon(UIManager.getIcon("Tree.leafIcon")),
          new GraydIcon(UIManager.getIcon("Tree.openIcon")),
          new GraydIcon(UIManager.getIcon("Tree.closedIcon")) );
  }
  
  public DisabledRenderer(Icon leafIcon, Icon openIcon, Icon closedIcon) {
    setDisabledLeafIcon(leafIcon);
    setDisabledOpenIcon(openIcon);
    setDisabledClosedIcon(closedIcon);
  }
    
  public Component getTreeCellRendererComponent(JTree tree,
                   Object value, boolean sel, boolean expanded,
                   boolean leaf, int row, boolean hasFocus) {     
    String stringValue = tree.convertValueToText(value, sel,
			    expanded, leaf, row, hasFocus);
    setText(stringValue);
    if (sel) {
      setForeground(getTextSelectionColor());
    } else {
      setForeground(getTextNonSelectionColor());
    }
    
    boolean treeIsEnabled = tree.isEnabled(); 
    boolean nodeIsEnabled = ((DisabledNode)value).isEnabled(); 
    boolean isEnabled = (treeIsEnabled && nodeIsEnabled);
    setEnabled(isEnabled);
    
    if (isEnabled) {
      selected = sel;
      if (leaf) {
        setIcon(getLeafIcon());
      } else if (expanded) {
        setIcon(getOpenIcon());
      } else {
        setIcon(getClosedIcon());
      }   
    } else {
      selected = false;
      if (leaf) {
        if (nodeIsEnabled) {
          setDisabledIcon(getLeafIcon());
        } else {
          setDisabledIcon(disabledLeafIcon);
        }
      } else if (expanded) {
        if (nodeIsEnabled) {
          setDisabledIcon(getOpenIcon());
        } else {
          setDisabledIcon(disabledOpenIcon);
        }
      } else {
        if (nodeIsEnabled) {
          setDisabledIcon(getClosedIcon());
        } else {
          setDisabledIcon(disabledClosedIcon);
        }
      }
    }
    return this;
  }  
  
  public void setDisabledLeafIcon(Icon icon) {
    disabledLeafIcon = icon;
  }
  
  public void setDisabledOpenIcon(Icon icon) {
    disabledOpenIcon = icon;
  }
  
  public void setDisabledClosedIcon(Icon icon) {
    disabledClosedIcon = icon;
  }
}

===============================================
// DisabledNode.java
/* (swing1.1.1beta2) */ 
package jp.gr.java_conf.tame.swing.tree;

import javax.swing.tree.*;


/**
 * @version 1.0 04/27/99
 */
public class DisabledNode extends DefaultMutableTreeNode  {
  protected boolean enabled;

  public DisabledNode() {
    this(null, true, true);
  }

  public DisabledNode(Object userObject) {
    this(userObject, true, true);
  }

  public DisabledNode(Object userObject, boolean allowsChildren) {
    this(userObject, allowsChildren, true);
  }

  public DisabledNode(Object userObject, boolean allowsChildren
  		         , boolean enabled) {
    super(userObject, allowsChildren);
    this.enabled = enabled;
  }
    
  public int getChildCount() {
    if (enabled) {
      return super.getChildCount();
    } else {
      return 0;
    }
  }
  
  public boolean isLeaf() {
    return (super.getChildCount() == 0);
  }
    
  public void setEnabled(boolean enabled) {
    this.enabled = enabled;
  }
    
  public boolean isEnabled() {
    return enabled;
  }
}
===================================================
// DisabledLeafIcon.java
// (swing1.1.1beta2)
package jp.gr.java_conf.tame.swing.icon;

import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.metal.*;


/**
 * @@version 1.0 04/28/99
 */
public class DisabledLeafIcon implements Icon {
  int width  = 16;
  int height = 16;
  int additionalHeight = 4;
 
  public void paintIcon(Component c, Graphics g, int x, int y) {
    int right  = width  - 1;
    int bottom = height + 1;

    g.setColor(c.getBackground());
    g.fillRect(0,0, width, getIconHeight());
    
    // Draw frame
    g.setColor( MetalLookAndFeel.getControlDisabled() );
    g.drawLine(        2,     2,        2, bottom );  // left
    g.drawLine(        2,     2, right -4,      2 );  // top
    g.drawLine(        2,bottom, right -1, bottom );  // bottom
    g.drawLine( right -1,     8, right -1, bottom );  // right
    g.drawLine( right -6,     4, right -2,      8 );  // slant 1
    g.drawLine( right -5,     3, right -4,      3 );  // part of slant 2
    g.drawLine( right -3,     4, right -3,      5 );  // part of slant 2
    g.drawLine( right -2,     6, right -2,      7 );  // part of slant 2
  }
  
  public int getIconWidth()  { return width; }
  public int getIconHeight() { return height + additionalHeight; } 
}
=======================================================
// DisabledLeafIcon.java
// (swing1.1.1beta2)
package jp.gr.java_conf.tame.swing.icon;

import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.metal.*;


/**
 * @@version 1.0 04/28/99
 */
public class DisabledFolderIcon implements Icon {
  int width  = 16;
  int height = 16;
  int additionalHeight = 2;
 
  public void paintIcon(Component c, Graphics g, int x, int y) {
    int right  = width  - 1;
    int bottom = height - 2;

    g.setColor(c.getBackground());
    g.fillRect(0,0, width, getIconHeight());
    
    // Draw tab
    g.setColor( MetalLookAndFeel.getControlDisabled() );
    g.drawLine( right -5, 2, right   , 2 );
    g.drawLine( right -6, 3, right -6, 4 );
    g.drawLine( right   , 3, right   , 4 );

    // Draw outline
    g.setColor( MetalLookAndFeel.getControlDisabled() );
    g.drawLine(        0,      5,        0, bottom );  // left side
    g.drawLine(        1,      4, right -7,      4 );  // first part of top
    g.drawLine( right -6,      5, right -1,      5 );  // second part of top
    g.drawLine( right   ,      4, right   , bottom );  // right side
    g.drawLine(        0, bottom, right   , bottom );  // bottom
  }
  
  public int getIconWidth()  { return width; }
  public int getIconHeight() { return height + additionalHeight; } 
}
===================================================
package jp.gr.java_conf.tame.swing.icon;


import java.awt.*;
import java.awt.image.*;
import javax.swing.*;


/**
 * @version 1.0 04/30/99
 */
public class GraydIcon implements Icon {
  Icon icon;
  Image image;
  
  public GraydIcon(Icon icon) {
    this.icon = icon;
  }

  public void paintIcon(Component c, Graphics g, int x, int y) {
    if (image == null) {
      Image orgImage  = c.createImage(getIconWidth(), getIconHeight());
      Graphics imageG = orgImage.getGraphics();	
      Color background = c.getBackground();
      imageG.setColor(background);
      imageG.fillRect(0,0, getIconWidth(), getIconHeight() );
      
      icon.paintIcon(c,imageG,x,y);
      
      ImageFilter colorfilter = new GrayFilter();
      image = c.createImage(
        new FilteredImageSource(orgImage.getSource(),colorfilter));
      
    }
    g.drawImage(image, x, y, null);
  }
  
  public int getIconWidth()  { return icon.getIconWidth();  }
  public int getIconHeight() { return icon.getIconHeight(); }
 



  class GrayFilter extends RGBImageFilter {
    
    public GrayFilter() {
      // If I set ture, black is gone?!
      //canFilterIndexColorModel = true;
    }
    
    public int filterRGB(int x, int y, int rgb) {
      int r = (rgb & 0xff0000) >> 16;
      int g = (rgb & 0x00ff00) >>  8;
      int b = (rgb & 0x0000ff);
      int iy = (int)(r + g + b)/3;
      iy = Math.min(255, iy);
      return ((rgb & 0xff000000)
           | (iy << 16)
           | (iy <<  8)
           | iy);
    }
  }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章