如何用jtable做个可编辑属性面板 就是类似eclipse的属性面板。用jtable,显示某个javaBean的所有属性,并可以编辑如果是boolean 则显示一个下拉框true和false,怎么实现?修改后,直接修改javaBean。有思路了,但十分混乱,哪位提供一些现成的经验 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 /* * 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); } }} /* * 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(); }} /* * 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"))); } } }} /* * 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(); }} /* * 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); } }} /* * 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); }} /* * 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; }} /* * 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); } }} /* * 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); }} 在事件响应方法中执行相应setter方法比如ComboBox的ItemStateChanged方法 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); } } } 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"))); } } } } Swing 用什么开发工具好 关于system.out.print和stdOut的区别 如何节约Java内存的一个问题(List) Java参考文档 SWT布局与窗口大小控制问题 问有关ResultSet的问题,急 java网络编程的基本内容有哪些?其特点和优势如何?请进行论述。 NamingEnumeration如何终止 JTextPane组件的垂直滚动条的问题 memorycache可以查看源码吗 log4j 日志过滤 CheckStyle问题
* 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);
}
}
}
* 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();
}
}
* 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")));
}
}
}
}
* 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();
}
}
* 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);
}
}
}
* 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);
}
}
* 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;
}
}
* 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);
}
}
}
* 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);
}
}
比如ComboBox的ItemStateChanged方法
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);
}
}
}
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")));
}
}
}
}