Applet图形用户界面的演示。TreeLayout布局管理器 : 定制布局 « 图形用户界面 « Java

En
Java
1. 图形用户界面
2. 三维图形动画
3. 高级图形
4. 蚂蚁编译
5. Apache类库
6. 统计图
7. 
8. 集合数据结构
9. 数据类型
10. 数据库JDBC
11. 设计模式
12. 开发相关类
13. EJB3
14. 电子邮件
15. 事件
16. 文件输入输出
17. 游戏
18. 泛型
19. GWT
20. Hibernate
21. 本地化
22. J2EE平台
23. 基于J2ME
24. JDK-6
25. JNDI的LDAP
26. JPA
27. JSP技术
28. JSTL
29. 语言基础知识
30. 网络协议
31. PDF格式RTF格式
32. 映射
33. 常规表达式
34. 脚本
35. 安全
36. Servlets
37. Spring
38. Swing组件
39. 图形用户界面
40. SWT-JFace-Eclipse
41. 线程
42. 应用程序
43. Velocity
44. Web服务SOA
45. 可扩展标记语言
Java 教程
Java » 图形用户界面 » 定制布局屏幕截图 
Applet图形用户界面的演示。TreeLayout布局管理器

import java.applet.Applet;
import java.awt.Button;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Label;
import java.awt.LayoutManager;
import java.awt.List;
import java.awt.Rectangle;
import java.awt.TextField;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

/**
 * Applet GUI demo of Gamelan TreeLayout layout manager. Constructs a tree and,
 * for each entry, makes a button that jumps to it.
 
 * The input language is a file like this: R Java Resources # root L - Resources
 * at Sun # label B http://www.sun.com/foo/bar Interesting Stuff # URLbutton B
 * http://javasoft.com/b/c More Stuff # URLbutton
 
 * The result is (supposedly) a beautiful(?) tree. Each L is a top-level label,
 * and each B is in the tree below it.
 
 * Could be made much fancier with getParameter("FontName"), "FontSize",
 * adjusting width with fontMetrics, etc. Works adequately for now.
 */
public class TreeLinkTest extends Applet {
  TreeLayout tl;

  public void init() {
    tl = new TreeLayout();
    setLayout(tl);
    Button root = new Button("This is the root");
    add("Root", root);
    tl.setRoot(root);
    Component x = new Label("A random label");
    add("label", x);
    tl.setParent(x, root);
    Component y;
    y = new TextField("Add any component");
    add("comp", y);
    tl.setParent(y, root);
    x = new List();
    ((Listx).add("List entry");
    ((Listx).add("Similarly useless list entry");
    add("list", x);
    tl.setParent(x, root);
    x = new Button("Extremely long and unnecessary button title");
    add("button", x);
    tl.setParent(x, y);
    x = new MyCanvas(getImage(getDocumentBase()"icons/tools.gif"));
    add("image", x);
    tl.setParent(x, y);
  }

  public void paint(Graphics g) {
    super.paint(g);
    tl.paintLines(g, getBackground());
  }

  class MyCanvas extends Canvas {
    Image img;

    MyCanvas(Image img) {
      this.img = img;
    }

    public Dimension getPreferredSize() {
      return new Dimension(6464);
    }

    public void update(Graphics g) {
      paint(g);
    }

    public void paint(Graphics g) {
      g.drawImage(img, 0, getSize().height / 163232this);
    }
  }
}

/**
 * Simple layout manager that arranges its children in a tree. The tree always
 * expands to fill the available area, and the internal components are resized
 * to fit the area proportional to their preferred size and the actual available
 * size.
 
 * This layout manager requires several method calls beyond the normal layout
 * manager. Please notice the following: * Components must be added using the
 * add(String, Component) method. The strings don't have to be unique, but must
 * be present. * Each instance must have exactly one root object, which must be
 * add()ed, <I>then </I> setRoot()ed. * Each component after the root must first
 * be added and then must be connected into the tree using setParent(child,
 * parent). * If you want lines between parents and children, you <EM>must
 * </EM> call paintLines() from your applet's paint() method.
 
 @author name unknown, xxx@blackdown.org
 */

class TreeLayout implements LayoutManager {
  TreeNode root;

  Hashtable nodes;

  public TreeLayout() {
    nodes = new Hashtable();
  }

  public void addLayoutComponent(String name, Component comp) {
    TreeNode tn = new TreeNode(comp);
    nodes.put(comp, tn);
  }

  public void removeLayoutComponent(Component comp) {
    nodes.remove(comp);
  }

  /**
   * You <em>must</em> make this call, otherwise none of the components will
   * be layed out.
   */
  public void setRoot(Component c) {
    root = (TreeNodenodes.get(c);
  }

  /**
   * Sets the tree parent of a child. The components <em>must</em> have been
   * previously added. If either component has not previously been added, this
   * injunction is silently ignored. Cycles are <em>not</em> checked.
   */
  public void setParent(Component child, Component parent) {
    TreeNode p = (TreeNodenodes.get(parent);
    TreeNode c = (TreeNodenodes.get(child);
    if ((p != null&& (c != null))
      p.addChild(c);
  }

  public Dimension minimumLayoutSize(Container target) {
    Dimension d = root.getMinimumSize();
    Insets insets = target.getInsets();
    d.width += insets.left + insets.right;
    d.height += insets.top + insets.bottom;
    return d;
  }

  public Dimension preferredLayoutSize(Container target) {
    Dimension d = root.getPreferredSize();
    Insets insets = target.getInsets();
    d.width += insets.left + insets.right;
    d.height += insets.top + insets.bottom;
    return d;
  }

  public void layoutContainer(Container target) {
    Insets insets = target.getInsets();
    Dimension d = target.getSize();
    Dimension root_pref = root.getPreferredSize();
    double xscale = ((double) (d.width - insets.left - insets.right(double) (root_pref.width));
    double yscale = ((double) (d.height - insets.top - insets.bottom(double) (root_pref.height));
    root.doLayout(xscale, yscale, insets.left, insets.top);
  }

  /**
   * This piece of hackery is needed since one cant really draw things from a
   * layout manager. Call this if you want to draw lines between components.
   */
  public void paintLines(Graphics g, Color bg) {
    Color dk = bg.darker();
    Color br = bg.brighter();
    root.paintLines(g, dk, br);
  }
}

class TreeNode {
  Component comp;

  Vector children;

  Dimension prefSz, minSz;

  TreeNode(Component comp) {
    super();
    this.comp = comp;
    children = new Vector();
  }

  Dimension getMinimumSize() {
    if (!comp.isVisible())
      return new Dimension(00);
    if (minSz == null) {
      Dimension d = comp.getMinimumSize();
      minSz = new Dimension(d.width, d.height);

      if (children.size() 0) {
        for (Enumeration e = children.elements(); e.hasMoreElements();) {
          TreeNode t = (TreeNode) (e.nextElement());
          if (t.comp.isVisible()) {
            d = t.getMinimumSize();
            minSz.height += d.height;
            minSz.width = Math.max(d.width, minSz.width);
          }
        }
      }
    }
    return minSz;
  }

  Dimension getPreferredSize() {
    if (!comp.isVisible())
      return new Dimension(00);
    if (prefSz == null) {
      Dimension d = comp.getPreferredSize();
      prefSz = new Dimension(d.width, d.height);

      if (children.size() 0) {
        int wmax = 0;
        for (Enumeration e = children.elements(); e.hasMoreElements();) {
          TreeNode t = (TreeNode) (e.nextElement());
          if (t.comp.isVisible()) {
            d = t.getPreferredSize();
            prefSz.height += d.height;
            if (wmax < d.width) {
              wmax = d.width;
            }
          }
        }
        prefSz.width += wmax;
      }
    }
    return prefSz;
  }

  void addChild(TreeNode t) {
    children.addElement(t);
    prefSz = null;
    minSz = null;
  }

  void removeChild(TreeNode t) {
    children.removeElement(t);
    prefSz = null;
    minSz = null;
  }

  void paintLines(Graphics g, Color dk, Color br) {
    if (comp.isVisible()) {
      Rectangle b = comp.getBounds();
      int x1off = b.x + b.width / 2;
      int x2off = b.x + b.width;
      int y1off = b.y;
      for (Enumeration e = children.elements(); e.hasMoreElements();) {
        TreeNode tn = (TreeNode) (e.nextElement());
        if (tn.comp.isVisible()) {
          Rectangle bn = tn.comp.getBounds();
          int y2off = bn.y + bn.height / 2;
          g.setColor(dk);
          g.drawLine(x1off, y1off, x1off, y2off);
          g.drawLine(x1off, y2off - 1, x2off, y2off - 1);
          g.setColor(br);
          g.drawLine(x1off + 1, y1off, x1off + 1, y2off);
          g.drawLine(x1off, y2off, x2off, y2off);
          tn.paintLines(g, dk, br);
        }
      }
    }
  }

  void doLayout(double xscale, double yscale, int x, int y) {
    // x and y are the offsets into the
    // Container where we start doing the
    // goodies for this Node
    if (comp.isVisible()) {
      Dimension pref = comp.getPreferredSize();
      int ht = (intMath.round(yscale * pref.height);
      int wd = (intMath.round(xscale * pref.width);

      ht = (pref.height < ht? pref.height : ht;
      wd = (pref.width < wd? pref.width : wd;

      comp.setBounds(x, y, wd, ht);
      y += ht;
      x += wd;

      for (Enumeration e = children.elements(); e.hasMoreElements();) {
        TreeNode tn = (TreeNode) (e.nextElement());
        if (tn.comp.isVisible()) {
          pref = tn.getPreferredSize();
          tn.doLayout(xscale, yscale, x, y);
          y += (intMath.round(yscale * pref.height);

        }
      }
    }
  }
}

           
       
Related examples in the same category
1. 自定义布局: EdgeLayout
2. 自定义布局管理器自定义布局管理器
3. ColumnLayoutColumnLayout
4. Java J2SE的相对布局管理器
5. Basically two (or more) columns of different, but constant, widths
6. GraphPaperLayoutGraphPaperLayout
7. 自定义布局演示自定义布局演示
www.java2java.com | Contact Us
Copyright 2010 - 2030 Java Source and Support. All rights reserved.
All other trademarks are property of their respective owners.