`

自定义组件XPropertyTable

阅读更多

这个是基于AsWing组件库实现的

主要是对JTable和PropertyTableModel进行组合封装,方便使用

可以设置表格数据,列头,属性,转换器,还可以渲染单元格,在特定列中加入其它组件

 

package mytest.table
{
	import org.aswing.BorderLayout;
	import org.aswing.JPanel;
	import org.aswing.JTable;
	import org.aswing.ListModel;
	import org.aswing.border.TitledBorder;
	import org.aswing.event.ClickCountEvent;
	import org.aswing.geom.IntDimension;
	import org.aswing.table.GeneralTableCellFactory;
	import org.aswing.table.PropertyTableModel;

	public class XPropertyTable extends JPanel
	{
		/** 数据模刑 */
		private var _listModel:ListModel;
		
		/** 列名数组 */
		private var _names:Array;
		
		/** 属性数组 */
		private var _properties:Array;
		
		/** 单元格转换数组 */
		private var _translators:Array;
		
		private var _table:JTable;
		
		private var _tableModel:PropertyTableModel;
		
		/** 双击表格处理函数 */
		private var _doubleClickFunction:Function;
		
		private var _titledBorder:TitledBorder;
		
		private var _scrollPane:JScrollPane;			
  			
		public function XPropertyTable($listModel:ListModel, $names:Array, $properties:Array, $translators:Array, $doubleClickFunction:Function = null)
		{
			
			this._listModel = $listModel;
			
			this._names = $names;
			
			this._properties = $properties;
			
			this._translators = $translators;
			
			this._doubleClickFunction = $doubleClickFunction;
			
			_tableModel = new PropertyTableModel(_listModel, _names, _properties, _translators); 
			
			/** 默认为不可编辑 */
			_tableModel.setAllCellEditable(false);
			
			_table = new JTable(_tableModel);
			
			if($doubleClickFunction != null){
				_table.addEventListener(ClickCountEvent.CLICK_COUNT, _doubleClickFunction);
			}
			
			_scrollPane = new JScrollPane(_table);
   
   			this.setLayout(new BorderLayout());
   			this.append(_scrollPane, BorderLayout.CENTER);			
		}
		
		
		
		
		/** 渲染列 */
		public function setRenderTableCell($column:int, $cellClass:Class):void{
			_table.getColumnAt($column).setCellFactory(new GeneralTableCellFactory($cellClass));
		}
		
		
		/** 设置数据 */
		public function setList($listModel:ListModel):void{
			_tableModel.setList($listModel);
		}
		
		
		
		/** 是否可编辑 */
		public function setAllCellEditable($value:Boolean = false):void{
			_tableModel.setAllCellEditable($value);
		}
		
		
  		/** 设置表格宽高 */
  		public function setTableSize($width:int, $height:int):void{
  			 this.setPreferredSize(new IntDimension($width, $height));
  		}		
		
		/** 设置行高 */
		public function setRowHeight($value:int):void{
			_table.setRowHeight($value);
		}
		
		
		
		/** 设置列的最大最小宽度  (可隐藏列)
		 * 
		 * 设置它相对于默认值75 的大小,各列不同的期望宽度形成一个比例关系,
		 * JTable 根据这个比例关系来分配初始化时各列的宽度
		 * 
		 * 功能说明
		 * 1)设置列宽度$maxWidth至$minWidth
		 * 		只能在$maxWidth至$minWidth 范围内手动调整宽度
		 * 		如果$maxWidth=$minWidth则不能手动调整调整宽度
		 * 
		 * 2)隐藏列
		 * 		当$maxWidth和$minWidth都为0时可隐藏列
		 * 		
		 */
		public function setColumnWidth($column:int, $maxWidth:int, $minWidth:int):void{
			_table.getTableHeader().getColumnModel().getColumn($column).setMaxWidth($maxWidth);   
			_table.getTableHeader().getColumnModel().getColumn($column).setMinWidth($minWidth);  
			
			_table.getColumnAt($column).setMaxWidth($maxWidth);
			_table.getColumnAt($column).setMinWidth($minWidth);
		}
		
		
		/** 设置单元格值 */
		public function setValueAt($value:Object, $row:int, $column:int):void{
			_table.setValueAt($value, $row, $column);
		}
		
		
		public function setTitle($value:String):void{
			_titledBorder = new TitledBorder(null, $value);
			
			this.setBorder(_titledBorder);
		}
		
		
		
		
		/** 取表格 */
		public function getTable():JTable{
			return _table;
		}
		
		
		/** 到表格数据模型 */
		public function getTableModel():PropertyTableModel{
			return _tableModel;
		}
			
		
		/** 取总行数 */
		public function getRowCount():int{
			return _table.getRowCount();
		}
		
		
		/** 取总列数 */
		public function getColumnCount():int{
			return _table.getColumnCount();
		}
		
		
		/** 取单元格值 */
		public function getValueAt($row:int, $column:int):Object{
			return _table.getValueAt($row, $column);
		}
		
		
	}
}

 

使用

package
{
	import flash.display.Sprite;
	
	import mytest.table.XPropertyTable;
	
	import org.aswing.AsWingManager;
	import org.aswing.BorderLayout;
	import org.aswing.JFrame;
	import org.aswing.JLabel;
	import org.aswing.JOptionPane;
	import org.aswing.JPanel;
	import org.aswing.VectorListModel;
	import org.aswing.event.ClickCountEvent;

	public class MyTest extends Sprite
	{
		private var frm:JFrame;
		private var mainPanel:JPanel;
		private var centerPanel:JPanel;
		private var btnPanel:JPanel;
		
		
		public function MyTest()
		{
			AsWingManager.initAsStandard(this);
			
			frm = new JFrame(null, "table");
			frm.setSizeWH(500, 500);
			
			mainPanel = new JPanel(new BorderLayout());
			
			var data:Array = 
				[{name:"iiley", sex:1, age:26}, 
					{name:"Comeny", sex:0, age:24}, 
					{name:"Tom", sex:1, age:30},
					{name:"Lita", sex:0, age:16}
				];
			
			
			var dataList:VectorListModel = new VectorListModel();
			dataList.appendAll(data);
			
			
			var xpt:XPropertyTable = new XPropertyTable(dataList, 
				["Guy's Name", "Sex", "Age", "Oper"], 
				["name", "sex", "age", "."], 
				[null, new SexTranslator(), null, null],
				__onDoubleClick
			);
			
			xpt.setTitle("表格一");
			
			/** 设置表格宽高 */
			xpt.setTableSize(400, 400);
			
			/** 设置是否可编辑 */
			xpt.setAllCellEditable(false);
			
			/** 设置行高 */
			xpt.setRowHeight(30);
			
			
			/** 设置列宽 */
			xpt.setColumnWidth(2, 50, 0);
	
			
			/** 渲染列 */
			xpt.setRenderTableCell(3, OperateCell);
			

			
			mainPanel.append(new JLabel("NORTH"), BorderLayout.NORTH);
			
			var tablePanel:JPanel = new JPanel();
			tablePanel.append(xpt);
			mainPanel.append(tablePanel, BorderLayout.CENTER);
			
			mainPanel.append(new JLabel("SOUTH"), BorderLayout.SOUTH);
			
			
			frm.getContentPane().setLayout(new BorderLayout());
			frm.getContentPane().append(mainPanel, BorderLayout.CENTER);
			
			frm.show();
			
		}
		
		/** 双击事件 */
		private function __onDoubleClick(event:ClickCountEvent):void{
			if(event.getCount() >= 2){
				JOptionPane.showMessageDialog("提示", "谁双击了我!");
			}
		}
		
		
		
	}
}
import org.aswing.BorderLayout;
import org.aswing.Component;
import org.aswing.FlowLayout;
import org.aswing.JButton;
import org.aswing.JPanel;
import org.aswing.JTable;
import org.aswing.table.PropertyTranslator;
import org.aswing.table.TableCell;


/** 单元格内容转换 */
class SexTranslator implements PropertyTranslator{
	
	
	public function translate(info:*, key:String):*{
		
		var sex:int = info[key] as int;
		
		if(sex == 0)
			return "男";
		else
			return "女";
		
	}
}



/** 渲染列 */
class OperateCell extends JPanel implements TableCell
{
	private var _btnPanel:JPanel;
	private var _editBtn:JButton;
	
	protected var _value:*;
	private var _table:JTable;
	
	private var _selectRow:int;
	
	
	public function OperateCell()
	{
		initUI();
	}
	
	private function initUI():void{
		
		_btnPanel = new JPanel(new FlowLayout(2,5,1));
		
		_editBtn = new JButton("编辑");
		
		_btnPanel.appendAll(_editBtn);
		
		this.setLayout(new BorderLayout());
		
		this.append(_btnPanel, BorderLayout.CENTER);
		
	} 
	
	
	
	
	public function setCellValue($value:*):void{
		
	}
	
	
	public function getCellValue():*{
		return _value;
	}
	
	
	
	public function setTableCellStatus(table:JTable, isSelected:Boolean, row:int, column:int):void{
		
		
	}
	
	
	public function getCellComponent() : Component {
		return this;
	}
	
	

	
	
	
}

 

分享到:
评论

相关推荐

    QML自定义组件显示在QT Designer库面板中的方法

    标题《QML自定义组件显示在QT Designer库面板中的方法》涉及的知识点非常具体,主要分为以下几个方面: 首先,标题表明了文章将介绍如何将自定义的QML组件集成到QT Designer的库面板中。这种集成有利于提高开发效率...

    uniapp使用抖音微信自定义组件-uniapp如何用抖音的组件

    ### uni-app 使用抖音微信自定义组件详解 #### 一、引言 随着移动互联网的发展,跨平台应用开发框架越来越受到开发者的青睐。其中,uni-app作为一款使用Vue.js语法进行多端开发的前端框架,凭借其高效、易用的特点...

    Qt美化界面、美化组件、自定义组件源码

    "Qt美化界面、美化组件、自定义组件源码"这个主题涵盖了提升Qt应用视觉效果和功能定制的核心知识点。Qt库提供了丰富的功能,允许开发者创建出优雅且高效的应用程序,而不仅仅是基本的用户界面。 首先,Qt美化界面...

    android自定义组件简单Demo

    在Android开发中,自定义组件是一项重要的技能,它允许开发者根据特定需求创建具有独特功能和外观的视图。本教程将通过一个简单的“TestOurselfWidget”实例来讲解如何实现自定义组件。自定义组件可以增强应用的用户...

    【OpenHarmony】 ArkTS 语法基础 ② ( ArkTS 自定义组件 )

    【OpenHarmony】ArkTS 语法基础 ② ( ArkTS 自定义组件 | 自定义可导入组件 - export 声明模块 | 导入自定义组件 - import 导入组件 ) https://hanshuliang.blog.csdn.net/article/details/139407374 博客源码快照 ...

    JSF2.0实战 - 4、自定义组件

    在JavaServer Faces (JSF) 2.0中,自定义组件是开发人员扩展框架功能的关键方式。通过创建自定义组件,你可以构建符合特定需求的用户界面元素,这些元素可以复用并集成到多个JSF应用程序中。本教程将深入探讨如何在...

    Android自定义组件开发

    在Android应用开发中,自定义组件是提升用户体验和实现独特设计的重要手段。本文将深入探讨Android自定义组件的开发过程,旨在帮助开发者更好地理解和实践这一关键技能。 首先,理解Android组件的基本概念至关重要...

    Flex4自定义组件开发.pdf

    ### Flex4自定义组件开发详解 #### 一、Flex4自定义组件概述 Flex4(也称为Spark)是Adobe Flex框架的一个重要版本,它引入了许多新的特性,包括改进的组件库、性能优化以及更好的可定制性。在Flex4中,自定义组件...

    android 自定义组件

    在Android开发中,自定义组件是提升应用独特性和用户体验的关键技术。自定义组件允许开发者根据需求扩展Android系统原生组件的功能,或者创建全新的组件样式,从而实现个性化界面和交互效果。下面将详细介绍Android...

    各种Flex自定义组件

    在Flex中,自定义组件是开发人员为了满足特定需求而创建的特殊用户界面元素。这些组件可以扩展标准的Flex组件库,或者从头开始构建,以提供独特的功能和视觉表现。 在标题“各种Flex自定义组件”中,我们可以推断这...

    Android自定义组件开发详解.docx

    【Android自定义组件开发详解】 Android自定义组件的开发是Android应用开发中的一个重要部分,它涉及到自定义View和ViewGroup的创建,以及对canvas和paint的深入理解和运用。自定义组件能够满足开发者对于UI设计的...

    ESP32S2基于VScode环境配置esp-idf插件添加自定义组件例程

    在本教程中,我们将详细讲解如何在VSCode环境中配置ESP-IDF插件,以便为ESP32S2开发项目,并添加自定义组件。 首先,确保你已经安装了VSCode和ESP-IDF开发环境。你可以从官方网站下载最新版本的VSCode,并通过...

    微信小程序自定义组件components(代码详解)

    微信小程序自定义组件是小程序框架中非常重要的一个功能,允许开发者封装一些通用的功能模块,以便在小程序的多个页面中重用。这样做不仅能够提高代码的复用性,也方便了项目的维护和扩展。 ### 微信小程序自定义...

    Android自定义组件开发详解自制书签目录版方便看.pdf

    Android自定义组件开发是一项高级技术,它允许开发者创建具有特定功能的UI组件,以满足应用程序的特殊需求。在深入了解自定义组件的开发之前,需要掌握一些基础知识,比如Java基础、面向对象编程(OOP)以及Android...

    C#的自定义组件和自定义控件

    本项目聚焦于C#中的自定义组件和控件开发,涵盖了一些常见的实用功能,如速选组件、窗口靠边停靠组件和窗口抖动组件,以及独特的UI元素,如黑白菜单栏和带进度显示的进度条。 1. **自定义组件(Custom Components)...

    android自定义组件动画基础班

    在Android开发中,自定义组件是提升应用独特性和用户体验的关键技术之一。自定义组件不仅可以满足特定的设计需求,还可以实现各种创新的交互效果,比如动画。本教程将带你深入理解“android自定义组件动画基础班”的...

    微信小程序自定义组件实现图片单指拖动双指缩放效果

    在微信小程序中,自定义组件是开发者为了复用代码、提高开发效率而创建的一种功能模块。本示例中,我们关注的是一个特定的自定义组件,它实现了图片的单指拖动以及双指缩放效果。这样的功能在很多应用场景中都非常...

    Android自定义组件开发详解

    《Android自定义组件开发详解》一书的作者李赞红在序言中表达了对Android开发教学的热情和对学员成长的关切。他提到,尽管市场上有许多Android开发相关的书籍,但大多数要么偏重理论、要么实践指导不足,或者只是...

    Datart 自定义组件-滚动数字组件

    Datart 自定义组件-滚动数字组件

    tapestry5 自定义组件

    在 Tapestry 5 框架中,自定义组件是扩展其功能的关键方式,它允许开发者根据特定需求创建个性化和可重用的 UI 元素。Tapestry 5 是一个强大的 Java Web 应用程序开发框架,它强调组件化、模块化以及声明式编程模型...

Global site tag (gtag.js) - Google Analytics