就是类似eclipse的属性面板。用jtable,显示某个javaBean的所有属性,并可以编辑如果是boolean 则显示一个下拉框true和false,怎么实现?修改后,直接修改javaBean。有思路了,但十分混乱,哪位提供一些现成的经验

解决方案 »

  1.   

    /*
     * PropertyColorValueEditor.java
     *
     * Created on 2007-10-4, 20:57:46
     *
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */package com.netwiseStudio.netwise.gui.professionalView.jPropertyTable;import java.awt.Component;
    import java.awt.Graphics;
    import java.awt.event.MouseEvent;
    import javax.swing.JColorChooser;
    import javax.swing.JTable;
    import javax.swing.UIManager;/**
     *
     * @author ljm-home
     */
    public class ColorValueCellEditor extends javax.swing.AbstractCellEditor implements javax.swing.table.TableCellEditor, java.awt.event.MouseListener {    private JTable table;
        private ColorValueEditorComponent editorComponent;
        java.awt.Color colorValue;    public ColorValueCellEditor() {
        }    public Object getCellEditorValue() {
            return this.colorValue;
        }    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            this.table = table;
            if (value instanceof java.awt.Color) {
                this.colorValue = (java.awt.Color) value;            editorComponent = new ColorValueEditorComponent(this.colorValue, table.getRowHeight(row));            return editorComponent;
            } else {
                return table.getCellEditor(row, column).getTableCellEditorComponent(table, value, isSelected, row, column);
            }
        }    public void mouseClicked(MouseEvent e) {
            java.awt.Color selColor = JColorChooser.showDialog(null, "选取颜色", this.colorValue);
            if (selColor != null) {
                this.colorValue = selColor;            //更新图标及内容
                this.editorComponent.setIcon(new ColorIcon(colorValue, 16, editorComponent.getHeight() * 2 / 3, true));
                this.editorComponent.setText("[" + colorValue.getRed() + "," + colorValue.getGreen() + "," + colorValue.getBlue() + "]");
            }
        }    public void mousePressed(MouseEvent e) {
        }    public void mouseReleased(MouseEvent e) {
        }    public void mouseEntered(MouseEvent e) {
        }    public void mouseExited(MouseEvent e) {
        }    class ColorValueEditorComponent extends javax.swing.JLabel {        /**
             * 构造函数
             * @param name 绘制内容
             * @param selected 是否选中
             */
            public ColorValueEditorComponent(java.awt.Color colorValue, int rowHeight) {
                this.setOpaque(true);
                this.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 3, 0, 0));
                this.setBackground(UIManager.getColor("Table.selectionBackground"));
                this.setForeground(UIManager.getColor("Table.selectionForeground"));
                this.setFont(UIManager.getFont("Table.font"));            this.setText("[" + colorValue.getRed() + "," + colorValue.getGreen() + "," + colorValue.getBlue() + "]");
                this.setIcon(new ColorIcon(colorValue, 16, rowHeight * 2 / 3, true));
                this.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));            this.addMouseListener(ColorValueCellEditor.this);
            }        /**
             * 绘制
             * @param g 设备上下文
             */
            @Override
            public void paint(Graphics g) {
                super.paint(g);            java.awt.Graphics2D g2d = (java.awt.Graphics2D) g;            java.awt.Paint bakPaint = g2d.getPaint();
                java.awt.Stroke bakStroke = g2d.getStroke();            //绘装饰线
                g2d.setPaint(UIManager.getColor("Table.gridColor"));
                g2d.setStroke(new java.awt.BasicStroke(1f, java.awt.BasicStroke.CAP_ROUND, java.awt.BasicStroke.JOIN_ROUND, 0, new float[]{0, 2}, 0));
                g2d.drawLine(0, this.getHeight() - 1, this.getWidth(), this.getHeight() - 1);            g2d.setPaint(bakPaint);
                g2d.setStroke(bakStroke);
            }
        }
    }
      

  2.   

    /*
     * PropertyGroup.java
     *
     * Created on 2007年8月28日, 上午10:46
     */package com.netwiseStudio.netwise.gui.professionalView.jPropertyTable;import java.util.ArrayList;/**
     * 属性组类
     * @author 李佳明
     * Email:<a>[email protected]</a>
     * @version 7.2.0.2
     */
    public class PropertyGroup {    /**
         * 属性组名
         */
        private String groupName;
        /**
         * 是否展开
         */
        private boolean expanded;
        /**
         * 子项表
         */
        ArrayList<PropertyItem> itemList;    /**
         * 类PropertyGroup的默认构造函数
         * @param groupName 属性组名
         */
        public PropertyGroup(String groupName) {
            this(groupName, true);
        }    /**
         * 类PropertyGroup的构造函数
         * @param groupName 属性组名
         * @param expanded 是否展开
         */
        public PropertyGroup(String groupName, boolean expanded) {
            this.groupName = groupName;
            this.expanded = expanded;        itemList = new ArrayList<PropertyItem>();
        }    /**
         * 获取属性组名
         * @return 属性组名
         */
        public String getGroupName() {
            return groupName;
        }    /**
         * 设定属性组名
         * @param groupName 属性组名
         */
        public void setGroupName(String groupName) {
            this.groupName = groupName;
        }    /**
         * 是否展开
         * @return 是否展开
         */
        public boolean isExpanded() {
            return expanded;
        }    /**
         * 设定是否展开
         * @param expanded 是否展开
         */
        public void setExpanded(boolean expanded) {
            this.expanded = expanded;
        }    /**
         * 获取子项数量
         * @return 子项数量
         */
        public int getItemCount() {
            return this.itemList.size();
        }    /**
         * 获取子项
         * @param index 指定的序号
         * @return 指定的子项
         */
        public PropertyItem getItem(int index) {
            try {
                return this.itemList.get(index);
            } catch (Exception e) {
                return null;
            }
        }    /**
         * 向组中增加一项
         * @param item 增加的项
         */
        public void addItem(PropertyItem item) {
            this.itemList.add(item);
        }    /**
         * 修改指定的子项
         * @param index 序号
         * @param item 新的子项
         */
        public void setItem(int index, PropertyItem item) {
            try {
                this.itemList.set(index, item);
            } catch (Exception e) {
            }
        }    /**
         * 移除指定的子项
         * @param index 序号
         */
        public void removeItem(int index) {
            try {
                this.itemList.remove(index);
            } catch (Exception e) {
            }
        }    /**
         * 返回对象描述
         * @return 对象描述
         */
        public String toStirng() {
            return this.getGroupName();
        }
    }
      

  3.   

    /*
     * PropertyGroupCellEditor.java
     *
     * Created on 2007年8月29日, 下午8:26
     *
     * To change this template, choose Tools | Template Manager
     * and open the template in the editor.
     */package com.netwiseStudio.netwise.gui.professionalView.jPropertyTable;import java.awt.Component;
    import java.awt.Graphics;
    import java.awt.event.MouseEvent;
    import javax.swing.JTable;
    import javax.swing.UIManager;/**
     * 属性组编辑器
     * @author 李佳明
     * Email:<a>[email protected]</a>
     * @version 7.2.0.2
     * @since 7.2.0.2
     */
    public class PropertyGroupCellEditor extends javax.swing.AbstractCellEditor implements javax.swing.table.TableCellEditor, java.awt.event.MouseListener {    /**
         * 编辑器组件
         */
        private GroupNameCellComponent nameCellComponent;
        /**
         * 当前编辑的表格
         */
        private javax.swing.JTable editorTable;
        /**
         * 被编缉的组
         */
        private PropertyGroup editGroup;    /** Creates a new instance of PropertyGroupCellEditor */
        public PropertyGroupCellEditor() {
        }    /**
         * 获取编辑器的值
         * @return 编辑器的值
         */
        public Object getCellEditorValue() {
            //无需返回值
            return null;
        }    /**
         * 获取编辑器组件
         * @param table 表格
         * @param value 单元格的值
         * @param isSelected 是否被选中
         * @param row 行号
         * @param column 列号
         * @return 编辑器组件
         */
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            editorTable = table;        //查是否正在编辑属性组
            if (value instanceof PropertyGroup) {
                editGroup = (PropertyGroup) value;            //创建并返回编辑器组件
                nameCellComponent = new GroupNameCellComponent(editGroup.getGroupName(), editGroup.isExpanded());            return nameCellComponent;
            }        //返回默认的编辑器组件
            return table.getCellEditor(row, column).getTableCellEditorComponent(table, value, isSelected, row, column);
        }    /**
         * 鼠标在编辑器上释放事件的通知方法
         * @param e 事件源发来的事件
         */
        public void mouseReleased(MouseEvent e) {
        }    /**
         * 鼠标在编辑器上压下事件的通知方法
         * @param e 事件源发来的事件
         */
        public void mousePressed(MouseEvent e) {
        }    /**
         * 鼠标退出编辑器事件的通知方法
         * @param e 事件源发来的事件
         */
        public void mouseExited(MouseEvent e) {
        }    /**
         * 鼠标进入编辑器事件的通知方法
         * @param e 事件源发来的事件
         */
        public void mouseEntered(MouseEvent e) {
        }    /**
         * 鼠标单击编辑器事件的通知方法
         * @param e 事件源发来的事件
         */
        public void mouseClicked(MouseEvent e) {
            if (editGroup != null) {
                if (e.getClickCount() > 1 || e.getClickCount() == 1 && e.getX() < 16) {
                    editGroup.setExpanded(!editGroup.isExpanded());                nameCellComponent.setExpanded(editGroup.isExpanded());                ((javax.swing.table.AbstractTableModel) this.editorTable.getModel()).fireTableDataChanged();
                }
            }
        }/**
         * 编辑器组件绘制类
         */
        class GroupNameCellComponent extends javax.swing.JLabel {        /**
             * 构造方法
             * @param name 显示的内容
             * @param expanded 是否展开
             */
            public GroupNameCellComponent(String name, boolean expanded) {
                //设置背景及字体
                this.setOpaque(true);
                this.setBackground(UIManager.getColor("Table.selectionBackground"));
                this.setFont(UIManager.getFont("Table.font").deriveFont(java.awt.Font.BOLD));            //设定图标
                if (expanded) {
                    this.setIcon(new javax.swing.ImageIcon(getClass().getResource("/res/images/16x16/expanded.png")));
                } else {
                    this.setIcon(new javax.swing.ImageIcon(getClass().getResource("/res/images/16x16/collapsed.png")));
                }
                this.setText(name);            //注册要监听的事件
                addMouseListener(PropertyGroupCellEditor.this);
            }        /**
             * 绘制
             * @param g 设备上下文
             */
            @Override
            public void paint(Graphics g) {
                super.paint(g);            java.awt.Graphics2D g2d = (java.awt.Graphics2D) g;            java.awt.Paint bakPaint = g2d.getPaint();
                java.awt.Stroke bakStroke = g2d.getStroke();            //在底部绘制一条虚线
                g2d.setPaint(UIManager.getColor("Table.gridlineColor"));
                g2d.setStroke(new java.awt.BasicStroke(1f, java.awt.BasicStroke.CAP_ROUND, java.awt.BasicStroke.JOIN_ROUND, 0, new float[]{0, 2}, 0));
                g2d.drawLine(16, this.getHeight() - 1, this.getWidth(), this.getHeight() - 1);            g2d.setPaint(bakPaint);
                g2d.setStroke(bakStroke);
            }        /**
             * 设定是否展开
             * @param expanded 是否展开
             */
            public void setExpanded(boolean expanded) {
                if (expanded) {
                    this.setIcon(new javax.swing.ImageIcon(getClass().getResource("/res/images/16x16/expanded.png")));
                } else {
                    this.setIcon(new javax.swing.ImageIcon(getClass().getResource("/res/images/16x16/collapsed.png")));
                }
            }
        }
    }
      

  4.   

    /*
     * PropertyItem.java
     *
     * Created on 2007年8月26日, 下午3:06
     *
     * To change this template, choose Tools | Template Manager
     * and open the template in the editor.
     */package com.netwiseStudio.netwise.gui.professionalView.jPropertyTable;/**
     * 属性表项类
     * @author 李佳明
     * Email:<a>[email protected]</a>
     * @version 7.2.0.2
     * @since 7.2.0.2
     */
    public class PropertyItem {    /**
         * 属性名
         */
        private String itemName;
        /**
         * 属性值
         */
        private Object itemValue;
        /**
         * 只读属性
         */
        private boolean readOnly;
        /**
         * 编辑器
         */
        private javax.swing.table.TableCellEditor propertyItemCellEditor;    /** Creates a new instance of PropertyItem */
        private PropertyItem() {
            this("", null);
        }    /**
         * 创建属性项
         *
         * @param itemName 属性项名称
         * @param value 属性项值
         */
        public PropertyItem(String itemName, Object value) {
            this(itemName, value, false);
        }    /**
         * 创建属性项
         *
         * @param itemName 属性项名称
         * @param value 属性项值
         * @param readOnly 只读属性
         */
        public PropertyItem(String itemName, Object value, boolean readOnly) {
            this.itemName = itemName;
            this.itemValue = value;
            this.readOnly = readOnly;        javax.swing.JTextField txt = new javax.swing.JTextField((getItemValue() == null) ? "" : getItemValue().toString());        this.propertyItemCellEditor = new javax.swing.DefaultCellEditor(txt);
        }    /**
         * 获取属性名
         * @return 属性名
         */
        public String getItemName() {
            return itemName;
        }    /**
         * 设置属性名
         * @param itemName 属性名
         */
        public void setItemName(String itemName) {
            this.itemName = itemName;
        }    /**
         * 获取属性值
         * @return 属性值
         */
        public Object getItemValue() {
            return itemValue;
        }    /**
         * 设定属性值
         * @param itemValue 属性值
         */
        public void setItemValue(Object itemValue) {
            this.itemValue = itemValue;
        }    /**
         * 是否是只读属性
         * @return 是否是只读属性
         */
        public boolean isReadOnly() {
            return readOnly;
        }    /**
         * 设定是否是只读属性
         * @param readOnly 是否是只读属性
         */
        public void setReadOnly(boolean readOnly) {
            this.readOnly = readOnly;
        }    /**
         * 获取编辑器
         * @return 编辑器
         */
        public javax.swing.table.TableCellEditor getPropertyItemCellEditor() {
            return propertyItemCellEditor;
        }    /**
         * 设定编辑器
         * @param propertyItemCellEditor 编辑器
         */
        public void setPropertyItemCellEditor(javax.swing.table.TableCellEditor propertyItemCellEditor) {
            this.propertyItemCellEditor = propertyItemCellEditor;
        }    /**
         * 返回对象描述
         * @return 对象描述
         */
        @Override
        public String toString() {
            return this.getItemName();
        }
    }
      

  5.   

    /*
     * PropertyNameCellRenderer.java
     *
     * Created on 2007年8月30日, 上午9:01
     */package com.netwiseStudio.netwise.gui.professionalView.jPropertyTable;import java.awt.Component;
    import java.awt.Graphics;
    import javax.swing.JTable;
    import javax.swing.UIManager;
    import javax.swing.table.TableCellRenderer;/**
     * 属性名绘制器类
     * @author 李佳明
     * Email:<a>[email protected]</a>
     * @version 7.2.0.2
     */
    public class PropertyNameCellRenderer implements TableCellRenderer {    /**类PropertyNameCellRenderer的默认构造函数 */
        public PropertyNameCellRenderer() {
        }    /**
         * 获取编辑器组件
         * @param table 表格
         * @param value 单元格的值
         * @param isSelected 是否被选中
         * @param hasFocus 是否有焦点
         * @param row 行号
         * @param column 列号
         * @return 绘制器组件
         */
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            if (column == 0) {
                if (value instanceof PropertyGroup) {
                    PropertyGroup group = (PropertyGroup) value;                return new GroupNameCellRenderer(group.getGroupName(), group.isExpanded(), isSelected);
                } else {
                    return new ItemNameCellRenderer((value == null) ? "" : value.toString(), isSelected, table.getRowHeight(row));
                }
            } else {
                return table.getDefaultRenderer(String.class).getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            }
        }/**
         * 组件绘制器类
         */
        class GroupNameCellRenderer extends javax.swing.JLabel {        /**
             * 构造函数
             * @param name 绘制内容
             * @param expanded 是否展开
             * @param selected 是否选中
             */
            public GroupNameCellRenderer(String name, boolean expanded, boolean selected) {
                //设置背景、字体及图标
                this.setOpaque(true);
                if (selected) {
                    this.setBackground(UIManager.getColor("Table.selectionBackground"));
                    this.setForeground(UIManager.getColor("Table.selectionForeground"));
                } else {
                    this.setBackground(UIManager.getColor("Panel.background"));
                }
                this.setFont(UIManager.getFont("Table.font").deriveFont(java.awt.Font.BOLD));            if (expanded) {
                    this.setIcon(new javax.swing.ImageIcon(getClass().getResource("/res/images/16x16/expanded.png")));
                } else {
                    this.setIcon(new javax.swing.ImageIcon(getClass().getResource("/res/images/16x16/collapsed.png")));
                }
                this.setText(name);
            }        /**
             * 绘制
             * @param g 设备上下文
             */
            @Override
            public void paint(Graphics g) {
                super.paint(g);            java.awt.Graphics2D g2d = (java.awt.Graphics2D) g;            java.awt.Paint bakPaint = g2d.getPaint();
                java.awt.Stroke bakStroke = g2d.getStroke();            //绘装饰线
                g2d.setPaint(UIManager.getColor("Table.gridColor"));
                g2d.setStroke(new java.awt.BasicStroke(1f, java.awt.BasicStroke.CAP_ROUND, java.awt.BasicStroke.JOIN_ROUND, 0, new float[]{0, 2}, 0));
                g2d.drawLine(16, this.getHeight() - 1, this.getWidth(), this.getHeight() - 1);            g2d.setPaint(bakPaint);
                g2d.setStroke(bakStroke);
            }
        }/**
         * 组件绘制器类
         */
        class ItemNameCellRenderer extends javax.swing.JLabel {        /**
             * 构造函数
             * @param name 绘制内容
             * @param selected 是否选中
             * @param rowHeight 行高
             */
            public ItemNameCellRenderer(String name, boolean selected, int rowHeight) {
                //设置背景、字体及图标
                this.setOpaque(true);
                if (selected) {
                    this.setBackground(UIManager.getColor("Table.selectionBackground"));
                    this.setForeground(UIManager.getColor("Table.selectionForeground"));
                } else {
                    this.setBackground(UIManager.getColor("Table.background"));
                }
                this.setFont(UIManager.getFont("Table.font"));
                this.setIcon(new ColorIcon(UIManager.getColor("Panel.background"), 16, rowHeight));            this.setText(name);
            }        /**
             * 绘制
             * @param g 设备上下文
             */
            @Override
            public void paint(Graphics g) {
                super.paint(g);            java.awt.Graphics2D g2d = (java.awt.Graphics2D) g;            java.awt.Paint bakPaint = g2d.getPaint();
                java.awt.Stroke bakStroke = g2d.getStroke();            //绘装饰线
                g2d.setPaint(UIManager.getColor("Table.gridColor"));
                g2d.setStroke(new java.awt.BasicStroke(1f, java.awt.BasicStroke.CAP_ROUND, java.awt.BasicStroke.JOIN_ROUND, 0, new float[]{0, 2}, 0));
                g2d.drawLine(16, this.getHeight() - 1, this.getWidth(), this.getHeight() - 1);
                g2d.setStroke(new java.awt.BasicStroke(1f));
                g2d.drawLine(this.getWidth() - 1, 0, this.getWidth() - 1, this.getHeight() - 1);            g2d.setPaint(bakPaint);
                g2d.setStroke(bakStroke);
            }
        }
    }
      

  6.   

    /*
     * PropertyTable.java
     *
     * Created on 2007年8月29日, 下午9:51
     *
     * To change this template, choose Tools | Template Manager
     * and open the template in the editor.
     */package com.netwiseStudio.netwise.gui.professionalView.jPropertyTable;import java.util.ArrayList;
    import javax.swing.table.TableCellEditor;
    import javax.swing.table.TableCellRenderer;/**
     * 属性表类
     * @author 李佳明
     * Email:<a>[email protected]</a>
     * @version 7.2.0.2
     * @since 7.2.0.2
     */
    public class PropertyTable extends javax.swing.JTable {    /** Creates a new instance of PropertyTable */
        public PropertyTable() {
            this(getTestTableModel());
        }    /**
         * 构造函数
         * @param dm 数据模型
         */
        public PropertyTable(PropertyTableModel dm) {
            super(dm);        this.setRowHeight(18);
            this.setShowHorizontalLines(false);
            this.setShowVerticalLines(false);
            this.setIntercellSpacing(new java.awt.Dimension(0, 0));
        }    /**
         * 获取单元格编辑器
         * @param row 行号
         * @param column 列号
         * @return 单元格编辑器
         */
        @Override
        public TableCellEditor getCellEditor(int row, int column) {
            if (column == 0) {
                if (this.getModel().getValueAt(row, column) instanceof PropertyGroup) {
                    return new PropertyGroupCellEditor();
                } else {
                    return super.getCellEditor(row, column);
                }
            } else if (column == 1) {
                PropertyItem item = ((PropertyTableModel) this.getModel()).getPropertyItem(row);
                if (item != null) {
                    return item.getPropertyItemCellEditor();
                } else {
                    return super.getCellEditor(row, column);
                }
            }        return super.getCellEditor(row, column);
        }    /**
         * 获取单元格绘制器
         * @param row 行号
         * @param column 列号
         * @return 单元格绘制器
         */
        @Override
        public TableCellRenderer getCellRenderer(int row, int column) {
            if (column == 0) {
                return new PropertyNameCellRenderer();
            } else {
                return new PropertyValueCellRenderer();
            }
        }    /**
         * 设置表格模型
         * @param dataModel 表格模型
         */
        public void setModel(PropertyTableModel dataModel) {
            super.setModel(dataModel);
        }    /**
         * 获取测试模型
         * @return 测试模型
         */
        private static PropertyTableModel getTestTableModel() {
            ArrayList<PropertyGroup> gpList = new ArrayList<PropertyGroup>();        PropertyGroup gp1 = new PropertyGroup("中国人", true);
            gp1.addItem(new PropertyItem("身高", 1.85));
            gp1.addItem(new PropertyItem("体重", 68));
            gp1.addItem(new PropertyItem("肤色", "黄色"));        PropertyGroup gp2 = new PropertyGroup("美国人", true);
            gp2.addItem(new PropertyItem("身高", 1.85));
            gp2.addItem(new PropertyItem("体重", 80));
            gp2.addItem(new PropertyItem("肤色", "白色"));
            PropertyGroup gp3 = new PropertyGroup("日本人", true);
            gp3.addItem(new PropertyItem("身高", 1.65));
            gp3.addItem(new PropertyItem("体重", 50));
            gp3.addItem(new PropertyItem("肤色", "黄色"));        gpList.add(gp1);
            gpList.add(gp2);
            gpList.add(gp3);        return new PropertyTableModel(gpList);
        }
    }
      

  7.   

    /*
     * PropertyTableModel.java
     *
     * Created on 2007年8月27日, 下午9:35
     *
     * To change this template, choose Tools | Template Manager
     * and open the template in the editor.
     */package com.netwiseStudio.netwise.gui.professionalView.jPropertyTable;/**
     * 属性表模型类
     * @author 李佳明
     * Email:<a>[email protected]</a>
     * @version 7.2.0.2
     * @since 7.2.0.2
     */
    public class PropertyTableModel extends javax.swing.table.AbstractTableModel {    /**
         * 模型数据
         */
        private java.util.ArrayList<PropertyGroup> data = new java.util.ArrayList<PropertyGroup>();    /**
         * Creates a new instance of PropertyTableModel
         * @param data 数据表
         */
        public PropertyTableModel(java.util.ArrayList<PropertyGroup> data) {
            this.data = data;
        }    /**
         * 获取行数
         * @return 行数
         */
        public int getRowCount() {
            int num = 0;
            for (PropertyGroup gp : data) {
                if (gp.isExpanded()) {
                    num += gp.getItemCount();
                }
                num++;
            }        return num;
        }    /**
         * 获取列数(永远为2)
         * @return 列数(永远为2)
         */
        public int getColumnCount() {
            return 2;
        }    /**
         * 获取列名
         * @param column 列号
         * @return 列名
         */
        @Override
        public String getColumnName(int column) {
            if (column == 0) {
                return "属性名";
            } else {
                return "属性值";
            }
        }    /**
         * 获取单元格是否可编辑
         * @param rowIndex 行号
         * @param columnIndex 列号
         * @return 是否可编辑
         */
        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            if (columnIndex == 0) {
                if (getValueAt(rowIndex, 0) instanceof PropertyGroup) {
                    return true;
                } else {
                    return false;
                }
            } else {
                if (getValueAt(rowIndex, 0) instanceof PropertyGroup) {
                    return false;
                } else {
                    PropertyItem item = getPropertyItem(rowIndex);
                    return !item.isReadOnly();
                }
            }
        }    /**
         * 获取单元格的值
         * @param rowIndex 行号
         * @param columnIndex 列号
         * @return 单元格的值
         */
        public Object getValueAt(int rowIndex, int columnIndex) {
            int num = 0;
            for (PropertyGroup gp : data) {            //计算上限
                int itemCount = 0;
                if (gp.isExpanded()) {
                    itemCount = gp.getItemCount();
                }
                //如果行号在某一组内
                if (rowIndex > num && rowIndex < (num + itemCount + 1)) {
                    int itemIndex = rowIndex - num - 1;
                    if (columnIndex == 0) {
                        return gp.getItem(itemIndex).getItemName();
                    } else {
                        return gp.getItem(itemIndex).getItemValue();
                    }
                } else if (num == rowIndex) {
                    if (columnIndex == 0) {
                        return gp;
                    } else {
                        return null;
                    }
                }            num = num + itemCount + 1;
            }        return null;
        }    /**
         * 设置单元格的值
         * @param aValue 单元格的值
         * @param rowIndex 行号
         * @param columnIndex 列号
         */
        @Override
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
            int num = 0;
            for (PropertyGroup gp : data) {            //计算上限
                int itemCount = 0;
                if (gp.isExpanded()) {
                    itemCount = gp.getItemCount();
                }
                //如果行号在某一组内
                if (rowIndex > num && rowIndex < (num + itemCount + 1)) {
                    int itemIndex = rowIndex - num - 1;
                    if (columnIndex == 1) {
                        PropertyItem item = gp.getItem(itemIndex);
                        item.setItemValue(aValue);
                        gp.setItem(itemIndex, item);
                    }
                }            num = num + itemCount + 1;
            }
            this.fireTableCellUpdated(rowIndex, columnIndex);
        }    /**
         * 根据行号获取属性项
         * @param row 行号
         * @return 属性项
         */
        public PropertyItem getPropertyItem(int row) {
            PropertyItem item = null;        int num = 0;
            for (PropertyGroup gp : data) {            //计算上限
                int itemCount = 0;
                if (gp.isExpanded()) {
                    itemCount = gp.getItemCount();
                }
                //如果行号在某一组内
                if (row > num && row < (num + itemCount + 1)) {
                    item = gp.getItem(row - num - 1);                break;
                }            num = num + itemCount + 1;
            }        return item;
        }
    }
      

  8.   

    /*
     * PropertyValueCellRenderer.java
     *
     * Created on 2007年8月30日, 上午10:29
     */package com.netwiseStudio.netwise.gui.professionalView.jPropertyTable;import java.awt.Color;
    import java.awt.Component;
    import java.awt.Graphics;
    import javax.swing.JTable;
    import javax.swing.UIManager;
    import javax.swing.table.TableCellRenderer;/**
     * 属性值绘制器类
     * @author 李佳明
     * Email:<a>[email protected]</a>
     * @version 7.2.0.2
     */
    public class PropertyValueCellRenderer implements TableCellRenderer {    /**类PropertyValueCellRenderer的默认构造函数 */
        public PropertyValueCellRenderer() {
        }    /**
         * 获取编辑器组件
         * @param table 表格
         * @param value 单元格的值
         * @param isSelected 是否被选中
         * @param hasFocus 是否有焦点
         * @param row 行号
         * @param column 列号
         * @return 绘制器组件
         */
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            if (column == 1) {
                PropertyItem item = ((PropertyTableModel) table.getModel()).getPropertyItem(row);            if (item != null) {
                    Object obj = item.getItemValue();                //如果是颜色
                    if (obj instanceof java.awt.Color) {
                        java.awt.Color colorValue = (java.awt.Color) obj;                    ItemValueCellRenderer colorValueRenderer = new ItemValueCellRenderer("[" + colorValue.getRed() + "," + colorValue.getGreen() + "," + colorValue.getBlue() + "]", isSelected);
                        colorValueRenderer.setIcon(new ColorIcon(colorValue, 16, table.getRowHeight(row) * 2 / 3, true));                    return colorValueRenderer;
                    } else {
                        return new ItemValueCellRenderer((item.getItemValue() == null) ? null : item.getItemValue().toString(), isSelected);
                    }
                } else {
                    return new GroupValueCellRenderer(isSelected || table.getEditingRow() == row);
                }
            } else {
                return table.getDefaultRenderer(String.class).getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            }
        }/**
         * 组件绘制器类
         */
        class GroupValueCellRenderer extends javax.swing.JLabel {        /**
             * 构造函数
             * @param selected 是否选中
             */
            public GroupValueCellRenderer(boolean selected) {
                this.setOpaque(true);            if (selected) {
                    this.setBackground(UIManager.getColor("Table.selectionBackground"));
                    this.setForeground(UIManager.getColor("Table.selectionForeground"));
                } else {
                    this.setBackground(UIManager.getColor("Panel.background"));
                }
            }        /**
             * 绘制
             * @param g 设备上下文
             */
            @Override
            public void paint(Graphics g) {
                super.paint(g);            java.awt.Graphics2D g2d = (java.awt.Graphics2D) g;            java.awt.Paint bakPaint = g2d.getPaint();
                java.awt.Stroke bakStroke = g2d.getStroke();            //绘装饰线
                g2d.setPaint(UIManager.getColor("Table.gridColor"));
                g2d.setStroke(new java.awt.BasicStroke(1f, java.awt.BasicStroke.CAP_ROUND, java.awt.BasicStroke.JOIN_ROUND, 0, new float[]{0, 2}, 0));
                g2d.drawLine(0, this.getHeight() - 1, this.getWidth(), this.getHeight() - 1);            g2d.setPaint(bakPaint);
                g2d.setStroke(bakStroke);
            }
        }/**
         * 组件绘制器类
         */
        class ItemValueCellRenderer extends javax.swing.JLabel {        /**
             * 构造函数
             * @param name 绘制内容
             * @param selected 是否选中
             */
            public ItemValueCellRenderer(String name, boolean selected) {
                this.setOpaque(true);
                this.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 3, 0, 0));
                if (selected) {
                    this.setBackground(UIManager.getColor("Table.selectionBackground"));
                    this.setForeground(UIManager.getColor("Table.selectionForeground"));
                } else {
                    this.setBackground(UIManager.getColor("Table.background"));
                }
                this.setFont(UIManager.getFont("Table.font"));            this.setText(name);
            }        /**
             * 绘制
             * @param g 设备上下文
             */
            @Override
            public void paint(Graphics g) {
                super.paint(g);            java.awt.Graphics2D g2d = (java.awt.Graphics2D) g;            java.awt.Paint bakPaint = g2d.getPaint();
                java.awt.Stroke bakStroke = g2d.getStroke();            //绘装饰线
                g2d.setPaint(UIManager.getColor("Table.gridColor"));
                g2d.setStroke(new java.awt.BasicStroke(1f, java.awt.BasicStroke.CAP_ROUND, java.awt.BasicStroke.JOIN_ROUND, 0, new float[]{0, 2}, 0));
                g2d.drawLine(0, this.getHeight() - 1, this.getWidth(), this.getHeight() - 1);            g2d.setPaint(bakPaint);
                g2d.setStroke(bakStroke);
            }
        }
    }
      

  9.   

    /*
     * ColorIcon.java
     *
     * Created on 2007-10-4, 20:23:55
     *
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */package com.netwiseStudio.netwise.gui.professionalView.jPropertyTable;import java.awt.Component;
    import java.awt.Graphics;/**
     * 颜色图标类
     * @author ljm-home
     */
    class ColorIcon implements javax.swing.Icon {    /**
         * 颜色
         */
        private java.awt.Color iconColor;
        /**
         * 图标宽
         */
        private int iconWidth;
        /**
         * 图标高
         */
        private int iconHeight;
        /**
         * 是否要边框
         */
        private boolean withBorder;    /**
         * 构造函数
         * @param color
         * @param w 图标宽
         * @param h 图标高
         */
        public ColorIcon(java.awt.Color color, int w, int h) {
            this(color, w, h, false);
        }    /**
         * 构造函数
         * @param color
         * @param w 图标宽
         * @param h 图标高
         */
        public ColorIcon(java.awt.Color color, int w, int h, boolean withBorder) {
            this.iconColor = color;
            this.iconWidth = w;
            this.iconHeight = h;
            this.withBorder = withBorder;
        }    /**
         * 获取图标宽
         * @return
         */
        public int getIconWidth() {
            return iconWidth;
        }    /**
         * 获取图标高
         * @return 图标高
         */
        public int getIconHeight() {
            return iconHeight;
        }    /**
         * 获取是否要边框
         * @return 是否要边框
         */
        public boolean isWithBorder() {
            return withBorder;
        }    /**
         * 绘制图标
         * @param c 便用图标的组件
         * @param g 设备上下文
         * @param x 图标宽
         * @param y 图标高
         */
        public void paintIcon(Component c, Graphics g, int x, int y) {
            java.awt.Graphics2D g2d = (java.awt.Graphics2D) g;        java.awt.Paint bakPaint = g2d.getPaint();        g2d.setPaint(this.iconColor);
            g.fillRect(x, y, getIconWidth(), this.getIconHeight());
            if (this.isWithBorder()) {
                g2d.setPaint(java.awt.Color.BLACK);
                g.drawRect(x, y, getIconWidth(), this.getIconHeight());
            }
            g2d.setPaint(bakPaint);
        }
    }
      

  10.   

    在事件响应方法中执行相应setter方法
    比如ComboBox的ItemStateChanged方法
      

  11.   

    package   com.netwiseStudio.netwise.gui.professionalView.jPropertyTable; import   java.awt.Component; 
    import   java.awt.Graphics; 
    import   java.awt.event.MouseEvent; 
    import   javax.swing.JColorChooser; 
    import   javax.swing.JTable; 
    import   javax.swing.UIManager; /** 
      * 
      *   @author   ljm-home 
      */ 
    public   class   ColorValueCellEditor   extends   javax.swing.AbstractCellEditor   implements   javax.swing.table.TableCellEditor,   java.awt.event.MouseListener   {         private   JTable   table; 
            private   ColorValueEditorComponent   editorComponent; 
            java.awt.Color   colorValue;         public   ColorValueCellEditor()   { 
            }         public   Object   getCellEditorValue()   { 
                    return   this.colorValue; 
            }         public   Component   getTableCellEditorComponent(JTable   table,   Object   value,   boolean   isSelected,   int   row,   int   column)   { 
                    this.table   =   table; 
                    if   (value   instanceof   java.awt.Color)   { 
                            this.colorValue   =   (java.awt.Color)   value;                         editorComponent   =   new   ColorValueEditorComponent(this.colorValue,   table.getRowHeight(row));                         return   editorComponent; 
                    }   else   { 
                            return   table.getCellEditor(row,   column).getTableCellEditorComponent(table,   value,   isSelected,   row,   column); 
                    } 
            }         public   void   mouseClicked(MouseEvent   e)   { 
                    java.awt.Color   selColor   =   JColorChooser.showDialog(null,   "选取颜色",   this.colorValue); 
                    if   (selColor   !=   null)   { 
                            this.colorValue   =   selColor;                         //更新图标及内容 
                            this.editorComponent.setIcon(new   ColorIcon(colorValue,   16,   editorComponent.getHeight()   *   2   /   3,   true)); 
                            this.editorComponent.setText("["   +   colorValue.getRed()   +   ","   +   colorValue.getGreen()   +   ","   +   colorValue.getBlue()   +   "]"); 
                    } 
            }         public   void   mousePressed(MouseEvent   e)   { 
            }         public   void   mouseReleased(MouseEvent   e)   { 
            }         public   void   mouseEntered(MouseEvent   e)   { 
            }         public   void   mouseExited(MouseEvent   e)   { 
            }         class   ColorValueEditorComponent   extends   javax.swing.JLabel   {                 /** 
                      *   构造函数 
                      *   @param   name   绘制内容 
                      *   @param   selected   是否选中 
                      */ 
                    public   ColorValueEditorComponent(java.awt.Color   colorValue,   int   rowHeight)   { 
                            this.setOpaque(true); 
                            this.setBorder(javax.swing.BorderFactory.createEmptyBorder(0,   3,   0,   0)); 
                            this.setBackground(UIManager.getColor("Table.selectionBackground")); 
                            this.setForeground(UIManager.getColor("Table.selectionForeground")); 
                            this.setFont(UIManager.getFont("Table.font"));                         this.setText("["   +   colorValue.getRed()   +   ","   +   colorValue.getGreen()   +   ","   +   colorValue.getBlue()   +   "]"); 
                            this.setIcon(new   ColorIcon(colorValue,   16,   rowHeight   *   2   /   3,   true)); 
                            this.setCursor(new   java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));                         this.addMouseListener(ColorValueCellEditor.this); 
                    }                 /** 
                      *   绘制 
                      *   @param   g   设备上下文 
                      */ 
                    @Override 
                    public   void   paint(Graphics   g)   { 
                            super.paint(g);                         java.awt.Graphics2D   g2d   =   (java.awt.Graphics2D)   g;                         java.awt.Paint   bakPaint   =   g2d.getPaint(); 
                            java.awt.Stroke   bakStroke   =   g2d.getStroke();                         //绘装饰线 
                            g2d.setPaint(UIManager.getColor("Table.gridColor")); 
                            g2d.setStroke(new   java.awt.BasicStroke(1f,   java.awt.BasicStroke.CAP_ROUND,   java.awt.BasicStroke.JOIN_ROUND,   0,   new   float[]{0,   2},   0)); 
                            g2d.drawLine(0,   this.getHeight()   -   1,   this.getWidth(),   this.getHeight()   -   1);                         g2d.setPaint(bakPaint); 
                            g2d.setStroke(bakStroke); 
                    } 
            } 
    }
      

  12.   

    package   com.netwiseStudio.netwise.gui.professionalView.jPropertyTable; import   java.awt.Component; 
    import   java.awt.Graphics; 
    import   java.awt.event.MouseEvent; 
    import   javax.swing.JTable; 
    import   javax.swing.UIManager; /** 
      *   属性组编辑器 
      *   @author   李佳明 
      *   Email: <a> [email protected] </a> 
      *   @version   7.2.0.2 
      *   @since   7.2.0.2 
      */ 
    public   class   PropertyGroupCellEditor   extends   javax.swing.AbstractCellEditor   implements   javax.swing.table.TableCellEditor,   java.awt.event.MouseListener   {         /** 
              *   编辑器组件 
              */ 
            private   GroupNameCellComponent   nameCellComponent; 
            /** 
              *   当前编辑的表格 
              */ 
            private   javax.swing.JTable   editorTable; 
            /** 
              *   被编缉的组 
              */ 
            private   PropertyGroup   editGroup;         /**   Creates   a   new   instance   of   PropertyGroupCellEditor   */ 
            public   PropertyGroupCellEditor()   { 
            }         /** 
              *   获取编辑器的值 
              *   @return   编辑器的值 
              */ 
            public   Object   getCellEditorValue()   { 
                    //无需返回值 
                    return   null; 
            }         /** 
              *   获取编辑器组件 
              *   @param   table   表格 
              *   @param   value   单元格的值 
              *   @param   isSelected   是否被选中 
              *   @param   row   行号 
              *   @param   column   列号 
              *   @return   编辑器组件 
              */ 
            public   Component   getTableCellEditorComponent(JTable   table,   Object   value,   boolean   isSelected,   int   row,   int   column)   { 
                    editorTable   =   table;                 //查是否正在编辑属性组 
                    if   (value   instanceof   PropertyGroup)   { 
                            editGroup   =   (PropertyGroup)   value;                         //创建并返回编辑器组件 
                            nameCellComponent   =   new   GroupNameCellComponent(editGroup.getGroupName(),   editGroup.isExpanded());                         return   nameCellComponent; 
                    }                 //返回默认的编辑器组件 
                    return   table.getCellEditor(row,   column).getTableCellEditorComponent(table,   value,   isSelected,   row,   column); 
            }         /** 
              *   鼠标在编辑器上释放事件的通知方法 
              *   @param   e   事件源发来的事件 
              */ 
            public   void   mouseReleased(MouseEvent   e)   { 
            }         /** 
              *   鼠标在编辑器上压下事件的通知方法 
              *   @param   e   事件源发来的事件 
              */ 
            public   void   mousePressed(MouseEvent   e)   { 
            }         /** 
              *   鼠标退出编辑器事件的通知方法 
              *   @param   e   事件源发来的事件 
              */ 
            public   void   mouseExited(MouseEvent   e)   { 
            }         /** 
              *   鼠标进入编辑器事件的通知方法 
              *   @param   e   事件源发来的事件 
              */ 
            public   void   mouseEntered(MouseEvent   e)   { 
            }         /** 
              *   鼠标单击编辑器事件的通知方法 
              *   @param   e   事件源发来的事件 
              */ 
            public   void   mouseClicked(MouseEvent   e)   { 
                    if   (editGroup   !=   null)   { 
                            if   (e.getClickCount()   >   1   ¦ ¦   e.getClickCount()   ==   1   &&   e.getX()   <   16)   { 
                                    editGroup.setExpanded(!editGroup.isExpanded());                                 nameCellComponent.setExpanded(editGroup.isExpanded());                                 ((javax.swing.table.AbstractTableModel)   this.editorTable.getModel()).fireTableDataChanged(); 
                            } 
                    } 
            } /** 
              *   编辑器组件绘制类 
              */ 
            class   GroupNameCellComponent   extends   javax.swing.JLabel   {                 /** 
                      *   构造方法 
                      *   @param   name   显示的内容 
                      *   @param   expanded   是否展开 
                      */ 
                    public   GroupNameCellComponent(String   name,   boolean   expanded)   { 
                            //设置背景及字体 
                            this.setOpaque(true); 
                            this.setBackground(UIManager.getColor("Table.selectionBackground")); 
                            this.setFont(UIManager.getFont("Table.font").deriveFont(java.awt.Font.BOLD));                         //设定图标 
                            if   (expanded)   { 
                                    this.setIcon(new   javax.swing.ImageIcon(getClass().getResource("/res/images/16x16/expanded.png"))); 
                            }   else   { 
                                    this.setIcon(new   javax.swing.ImageIcon(getClass().getResource("/res/images/16x16/collapsed.png"))); 
                            } 
                            this.setText(name);                         //注册要监听的事件 
                            addMouseListener(PropertyGroupCellEditor.this); 
                    }                 /** 
                      *   绘制 
                      *   @param   g   设备上下文 
                      */ 
                    @Override 
                    public   void   paint(Graphics   g)   { 
                            super.paint(g);                         java.awt.Graphics2D   g2d   =   (java.awt.Graphics2D)   g;                         java.awt.Paint   bakPaint   =   g2d.getPaint(); 
                            java.awt.Stroke   bakStroke   =   g2d.getStroke();                         //在底部绘制一条虚线 
                            g2d.setPaint(UIManager.getColor("Table.gridlineColor")); 
                            g2d.setStroke(new   java.awt.BasicStroke(1f,   java.awt.BasicStroke.CAP_ROUND,   java.awt.BasicStroke.JOIN_ROUND,   0,   new   float[]{0,   2},   0)); 
                            g2d.drawLine(16,   this.getHeight()   -   1,   this.getWidth(),   this.getHeight()   -   1);                         g2d.setPaint(bakPaint); 
                            g2d.setStroke(bakStroke); 
                    }                 /** 
                      *   设定是否展开 
                      *   @param   expanded   是否展开 
                      */ 
                    public   void   setExpanded(boolean   expanded)   { 
                            if   (expanded)   { 
                                    this.setIcon(new   javax.swing.ImageIcon(getClass().getResource("/res/images/16x16/expanded.png"))); 
                            }   else   { 
                                    this.setIcon(new   javax.swing.ImageIcon(getClass().getResource("/res/images/16x16/collapsed.png"))); 
                            } 
                    } 
            } 
    }