属性表 : Java组件 « 开发相关类 « 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 » 开发相关类 » Java组件屏幕截图 
属性表
属性表
 
/*
 * Copyright (c) 2000 David Flanagan.  All rights reserved.
 * This code is from the book Java Examples in a Nutshell, 2nd Edition.
 * It is provided AS-IS, WITHOUT ANY WARRANTY either expressed or implied.
 * You may study, use, and modify it for any non-commercial purpose.
 * You may distribute it non-commercially as long as you retain this notice.
 * For a commercial use license, or to purchase the book (recommended),
 * visit http://www.davidflanagan.com/javaexamples2.
 */

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.util.Arrays;
import java.util.Comparator;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

/**
 * This class is a JTable subclass that displays a table of the JavaBeans
 * properties of any specified class.
 */
public class PropertyTable extends JTable {
  /** This main method allows the class to be demonstrated standalone */
  public static void main(String[] args) {
    // Specify the name of the class as a command-line argument
    Class beanClass = null;
    try {
      // Use reflection to get the Class from the classname
      beanClass = Class.forName("javax.swing.JLabel");
    catch (Exception e) { // Report errors
      System.out.println("Can't find specified class: " + e.getMessage());
      System.out.println("Usage: java TableDemo <JavaBean class name>");
      System.exit(0);
    }

    // Create a table to display the properties of the specified class
    JTable table = new PropertyTable(beanClass);

    // Then put the table in a scrolling window, put the scrolling
    // window into a frame, and pop it all up on to the screen
    JScrollPane scrollpane = new JScrollPane(table);
    JFrame frame = new JFrame("Properties of JavaBean: ");
    frame.getContentPane().add(scrollpane);
    frame.setSize(500400);
    frame.setVisible(true);
  }

  /**
   * This constructor method specifies what data the table will display (the
   * table model) and uses the TableColumnModel to customize the way that the
   * table displays it. The hard work is done by the TableModel implementation
   * below.
   */
  public PropertyTable(Class beanClass) {
    // Set the data model for this table
    try {
      setModel(new JavaBeanPropertyTableModel(beanClass));
    catch (IntrospectionException e) {
      System.err.println("WARNING: can't introspect: " + beanClass);
    }

    // Tweak the appearance of the table by manipulating its column model
    TableColumnModel colmodel = getColumnModel();

    // Set column widths
    colmodel.getColumn(0).setPreferredWidth(125);
    colmodel.getColumn(1).setPreferredWidth(200);
    colmodel.getColumn(2).setPreferredWidth(75);
    colmodel.getColumn(3).setPreferredWidth(50);

    // Right justify the text in the first column
    TableColumn namecol = colmodel.getColumn(0);
    DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
    renderer.setHorizontalAlignment(SwingConstants.RIGHT);
    namecol.setCellRenderer(renderer);
  }

  /**
   * This class implements TableModel and represents JavaBeans property data
   * in a way that the JTable component can display. If you've got some type
   * of tabular data to display, implement a TableModel class to describe that
   * data, and the JTable component will be able to display it.
   */
  static class JavaBeanPropertyTableModel extends AbstractTableModel {
    PropertyDescriptor[] properties; // The properties to display

    /**
     * The constructor: use the JavaBeans introspector mechanism to get
     * information about all the properties of a bean. Once we've got this
     * information, the other methods will interpret it for JTable.
     */
    public JavaBeanPropertyTableModel(Class beanClass)
        throws java.beans.IntrospectionException {
      // Use the introspector class to get "bean info" about the class.
      BeanInfo beaninfo = Introspector.getBeanInfo(beanClass);
      // Get the property descriptors from that BeanInfo class
      properties = beaninfo.getPropertyDescriptors();
      // Now do a case-insensitive sort by property name
      // The anonymous Comparator implementation specifies how to
      // sort PropertyDescriptor objects by name
      Arrays.sort(properties, new Comparator() {
        public int compare(Object p, Object q) {
          PropertyDescriptor a = (PropertyDescriptorp;
          PropertyDescriptor b = (PropertyDescriptorq;
          return a.getName().compareToIgnoreCase(b.getName());
        }

        public boolean equals(Object o) {
          return o == this;
        }
      });
    }

    // These are the names of the columns represented by this TableModel
    static final String[] columnNames = new String[] { "Name""Type",
        "Access""Bound" };

    // These are the types of the columns represented by this TableModel
    static final Class[] columnTypes = new Class[] { String.class,
        Class.class, String.class, Boolean.class };

    // These simple methods return basic information about the table
    public int getColumnCount() {
      return columnNames.length;
    }

    public int getRowCount() {
      return properties.length;
    }

    public String getColumnName(int column) {
      return columnNames[column];
    }

    public Class getColumnClass(int column) {
      return columnTypes[column];
    }

    /**
     * This method returns the value that appears at the specified row and
     * column of the table
     */
    public Object getValueAt(int row, int column) {
      PropertyDescriptor prop = properties[row];
      switch (column) {
      case 0:
        return prop.getName();
      case 1:
        return prop.getPropertyType();
      case 2:
        return getAccessType(prop);
      case 3:
        return new Boolean(prop.isBound());
      default:
        return null;
      }
    }

    // A helper method called from getValueAt() above
    String getAccessType(PropertyDescriptor prop) {
      java.lang.reflect.Method reader = prop.getReadMethod();
      java.lang.reflect.Method writer = prop.getWriteMethod();
      if ((reader != null&& (writer != null))
        return "Read/Write";
      else if (reader != null)
        return "Read-Only";
      else if (writer != null)
        return "Write-Only";
      else
        return "No Access"// should never happen
    }
  }
}

           
         
  
Related examples in the same category
1. Java组件: BeanContextSupportJava组件: BeanContextSupport
2. Java组件:测试程序,增加了100组件到背景Java组件:测试程序,增加了100组件到背景
3. Java组件:如何使用instantiateChild ( )方便的方法创建一个组件Java组件:如何使用instantiateChild ( )方便的方法创建一个组件
4. Java组件:说明交付BeanContextMembershipEventJava组件:说明交付BeanContextMembershipEvent
5. Java组件:创建的所有对象的测试服务能力Java组件:创建的所有对象的测试服务能力
6. 组件集装箱组件集装箱
7. 性能测试
8. 反思一个组件反思一个组件
9. 在JFileChooser对话框倾听改变到所选文件
10. 获取选定的文件清单
11. 在JFileChooser对话框倾听改变到当前目录
12. 在标题JFileChooser对话框显示当前目录中
13. 在标题JFileChooser对话框中设置配件组件
14. 转换组件为XML
15. 聆听组件属性变更事件
16. 列表组件的属性名称
17. 防止组件的属性列化到XML
18. 创建一个实例组件
19. 转换XML持久到组件
20. 确定组件的属性类型
21. 聆听了限制属性变化
22. 组件属性
23. 实现一个有界属性
24. Implementing a Constrained Property: fires a PropertyChangeEvent whenever its value is about to be changed.
25. 一个组件实例
26. 列出自建的属性名称
27. 获得和设置一个组件的属性
28. Get and set the value of a property in a bean using Expression and Statement
29. 获取和设置的对象类型属性
30. 获得和设置一个原始类型属性
31. 获得和建立了一个数组类型的属性
32. Serializing a Bean to XML: XMLEncoder only persists the value of public properties.
33. 防止XML序列化一个组件
34. 防止一个组件属性被序列化到XML
35. 序列化不可改变组件属性为XML
36. Listening for a Property Change Event: A property change event is fired when a bound property is changed.
37. Listening for a Vetoable Property Change Event
38. 读取组件的属性值
39. CAD系统的储存和恢复状态CAD系统的储存和恢复状态
www.java2java.com | Contact Us
Copyright 2010 - 2030 Java Source and Support. All rights reserved.
All other trademarks are property of their respective owners.