自定義組件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;
	}
	
	

	
	
	
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章