`

javafx2.0 在表格(TableView)中显示选择按钮(CheckBox)

阅读更多

 

 

要在JFX的表格中显示自定义的单元(TableCell), 必须实现一个继承于javafx.scene.control.TableCell的自定义单元.  JFX官方没有为TableView提供像列表/选项按钮/文本框这样的常用控件, 如果你需要这些控件, 可以在另外一个项目中下载这些控件. 参见:http://www.javafxdata.org .(以下代码的实现参考了www.javafxdata.org)

 

首先定义一个TableCell来显示CheckBox.

 

/* CheckBoxTableCell.java 1.0 2010-2-2
 * 
 * Copyright (c) 2012 by Chen Zhiwu
 * All rights reserved.
 * 
 * The copyright of this software is own by the authors.
 * You may not use, copy or modify this software, except
 * in accordance with the license agreement you entered into 
 * with the copyright holders. For details see accompanying license
 * terms.
 */
public class CheckBoxTableCell<S, T> extends TableCell<S, T> {
	private final CheckBox checkBox;
	private final boolean showText;
	private final Callback<T, String> toString;
	private final Callback<Integer, ObservableValue<Boolean>> getSelectedProperty;
	private ObservableValue<Boolean> booleanProperty;


	public CheckBoxTableCell() {
		this(null, null);
	}

	public CheckBoxTableCell(
			Callback<Integer, ObservableValue<Boolean>> toString) {
		this(toString, null);
	}

	public CheckBoxTableCell(
			Callback<Integer, ObservableValue<Boolean>> getSelectedProperty,
			Callback<T, String> toString) {
		this.getSelectedProperty = getSelectedProperty;
		this.toString = toString;
		this.showText = toString != null;
		this.checkBox = new CheckBox();
		setAlignment(Pos.CENTER);
		setGraphic(checkBox);
		
		if (showText) {
			checkBox.setAlignment(Pos.CENTER_LEFT);
		}
	}
	
	public CheckBoxTableCell(
			Callback<T, ObservableValue<Boolean>> callback,
			Callback<Integer, ObservableValue<Boolean>> getSelectedProperty,
			Callback<T, String> toString) {
		this.getSelectedProperty = getSelectedProperty;
		this.toString = toString;
		this.showText = toString != null;
		this.checkBox = new CheckBox();
		setAlignment(Pos.CENTER);
		setGraphic(checkBox);
		
		if (showText) {
			checkBox.setAlignment(Pos.CENTER_LEFT);
		}
	}
	
	
	@Override
	protected void updateItem(T item, boolean empty) {
		super.updateItem(item, empty);
		if (empty) {
			setText(null);
			setGraphic(null);
			return;
		} 
		if (this.showText) {
			setText(this.toString.call(item));
		}
		setGraphic(this.checkBox);
		if (this.booleanProperty instanceof BooleanProperty)
			this.checkBox.selectedProperty().unbindBidirectional(
					(BooleanProperty) this.booleanProperty);
		ObservableValue localObservableValue = getSelectedProperty();
		if (localObservableValue instanceof BooleanProperty) {
			this.booleanProperty = localObservableValue;
			this.checkBox.selectedProperty().bindBidirectional(
					(BooleanProperty) this.booleanProperty);
		}
		this.checkBox.visibleProperty().bind(getTableView().editableProperty()
				.and(getTableColumn().editableProperty())
				.and(editableProperty()));
	};

	private ObservableValue getSelectedProperty() {
		return ((this.getSelectedProperty != null) ? (ObservableValue) this.getSelectedProperty
				.call(Integer.valueOf(getIndex())) : getTableColumn()
				.getCellObservableValue(getIndex()));
	}
}
 

 

CellFactory作为便利方法, 方便外部使用CheckBoxTableCell.

 

/* CellFactory.java 1.0 2010-2-2
 * 
 * Copyright (c) 2012 by Chen Zhiwu
 * All rights reserved.
 * 
 * The copyright of this software is own by the authors.
 * You may not use, copy or modify this software, except
 * in accordance with the license agreement you entered into 
 * with the copyright holders. For details see accompanying license
 * terms.
 */

public class CellFactory {
	
	//////         table check box

	
	public static <S> Callback<TableColumn<S, Boolean>, TableCell<S, Boolean>> tableCheckBoxColumn() {
		return tableCheckBoxColumn(null, null);
	}

	public static <S, T> Callback<TableColumn<S, T>, TableCell<S, T>> tableCheckBoxColumn(
			Callback<Integer, ObservableValue<Boolean>> paramCallback) {
		return tableCheckBoxColumn(paramCallback, null);
	}

	public static <S, T> Callback<TableColumn<S, T>, TableCell<S, T>> tableCheckBoxColumn(
			Callback<Integer, ObservableValue<Boolean>> paramCallback,
			boolean paramBoolean) {
		Callback<T, String> callback = new Callback<T, String>() {
			@Override
			public String call(T t) {
				return ((t == null) ? "" : t.toString());
			}
		};
		return tableCheckBoxColumn(paramCallback, callback);
	}

	public static <S, T> Callback<TableColumn<S, T>, TableCell<S, T>> tableCheckBoxColumn(
			final Callback<Integer, ObservableValue<Boolean>> getSelectedProperty,
			final Callback<T, String> toString) {
		return new Callback<TableColumn<S, T>, TableCell<S, T>>() {
			@Override
			public TableCell<S, T> call(TableColumn<S, T> paramTableColumn) {
				return new CheckBoxTableCell<S,T>(getSelectedProperty,toString);
			}
		};
	}

	
	
	
}
 

 

定义一个用于测试的实体类. 

 

public class Goods{//商品类
        private boolean available;//是否有效   用原子类型表示
        private BooleanProperty  hotSaleProperty;//是否热销 用可绑定属性表示

        public boolean getAvailable(){
                return avaliable;
        }

        public void setAvailable(boolean newValue){
                this.available=newValue;
        }

        public boolean getHotSale(){
                return hotSaleProperty.get();
        }
        public boolean setHotSale(boolean newValue){
                hotSaleProperty.set(newValue);
        }
}
 

 

 

外部使用CheckBoxTableCell.

 

 

 

 

TableColumn<Goods, Boolean>  availableColumn=new TableColumn<Goods, Boolean>("是否有效");
col.setCellValueFactory(new PropertyValueFactory<Goods,Boolean>("available");
col.setCellFactory(CellFactory.tableCheckBoxColumn(new Callback<Integer, ObservableValue<Boolean>>() {
	@Override
	public ObservableValue<Boolean> call(Integer index) {
							final Goods g= table.getItems().get(index);
							ObservableValue<Boolean> retval = new SimpleBooleanProperty(g,"available",g.getAvailable());
							retval.addListener(new ChangeListener<Boolean>() {
								@Override
								public void changed(
										ObservableValue<? extends Boolean> observable,
										Boolean oldValue, Boolean newValue) {
									g.setAvailable(newValue);
								}
							});
							return retval;	
						}
	}));

TableColumn<Goods, Boolean>  hotSaleColumn=new TableColumn<Goods, Boolean>("是否热销");
col.setCellValueFactory(new PropertyValueFactory<Goods,Boolean>("hotSale");
col.setCellFactory(CellFactory.tableCheckBoxColumn());
 

 

上面两个列使用不同的绑定方法. 第一列"是否有效"对应Goods中的boolean属性available. 该属性不支持JFX的动态绑定, 所以在定义列的时候建立一个Callback来动态更新属性.

第二个列"是否热销"对应Goods的boolean属性hotSaleProperty. 该属性支持JFX的动态绑定, 在定义列时无需做任何修改就可以实现实体与表格的绑定.

从上面的例子也可以看到, 在新版的JFX中, 如果实体类原生支持JFX的绑定类型在实现数据绑定会方便很多.

 

以上是JFX中自定义单选框的实现. 关于列表(ListView)和树(TreeView)的实现也类似.

 

参考阅读:

JFX的数据绑定:http://docs.oracle.com/javafx/2.0/binding/jfxpub-binding.htm

用于数据绑定的JFX框架: http://www.javafxdata.org

 

 

 

 

 

 

 

 

 

 

1
0
分享到:
评论
1 楼 duguquezi 2012-08-16  
    [i][/i][u][/u]

相关推荐

    JavaFX2.0_表格框TableView

    在JavaFX 2.0中,TableView是一种强大的控件,用于以表格的形式展示数据。它提供了灵活的布局和丰富的功能,使开发者能够轻松地构建数据驱动的用户界面。以下是关于JavaFX 2.0表格框TableView及其核心组件的详细解释...

    javafx 2.0 tableview 实例

    在JavaFX 2.0中,TableView是一个重要的组件,它用于展示数据集,类似于我们常见的电子表格。这个"javafx 2.0 tableview 实例"是一个很好的学习资源,它可以帮助开发者了解如何在JavaFX应用程序中有效地使用...

    javaFX高级教程JavaFX2.0的FXML语言 中文文档

    1. 在 NetBeans IDE 中选择 File &gt; New Project。 2. 在 JavaFX application category 下选择 JavaFX FXML Application,然后点击 Next。 3. 输入项目名称为 `FXMLExample` 并点击 Finish。 4. 下载所需的背景图片 `...

    javafx 2.0 tableView 实例

    在JavaFX 2.0版本中,`TableView`是一个核心的组件,用于展示结构化的数据集,类似于传统的电子表格。下面我们将深入探讨`TableView`的使用方法,包括数据列的绑定。 `TableView`是JavaFX中的一个视图类,它允许...

    javafx2.0 中文文档.zip

    总的来说,“javafx2.0 中文文档.zip”中的资料详细介绍了JavaFX 2.0的各项特性和使用方法,无论是新手还是有经验的开发者,都可以从中获取到宝贵的指导。通过深入学习和实践,开发者能够利用JavaFX 2.0构建出功能...

    JavaFX高级教程:JavaFX2.0的FXML语言(中文版)

    在JavaFX 2.0中,FXML(FXML Language)被引入,这是一种基于XML的声明性语言,专门用于定义应用程序的用户界面。这个高级教程主要关注如何使用FXML来设计和构建用户界面。 FXML的优势在于它的声明性,使得UI布局...

    JavaFX2.0 体系结构和框架

    【JavaFX2.0 体系结构和框架】深入解析 JavaFX2.0 是一个基于Java技术的丰富客户端平台,专为开发富互联网应用程序(RIAs)设计,它以其出色的动态画面和美观的用户界面而受到赞誉。尽管中文资料相对较少,但通过对...

    javafx2.0在netbeans插件

    4. **创建 JavaFX 项目**:通过插件,开发者可以在 NetBeans 中选择“JavaFX”项目类型,然后按照向导创建一个新的 JavaFX 应用。这会自动生成必需的项目结构和源代码文件。 5. **FXML 设计**:JavaFX 2.0 引入了 ...

    JavaFX2.0内建控件教程(全部控件)

    以下是一些 JavaFX 2.0 中提供的 UI 控件: - **Label**:用于显示静态文本。 - **Button**:用于触发事件的动作按钮。 - **Radio Button**:一组互斥的选择项。 - **Toggle Button**:可以在选中和未选中状态之间...

    javafx2.0官方例子

    javafx2.0,java,javafx,例子,代码 Sun公司(已于20092008年12月05日发布了JavaFX技术的正式版,它使您能利用 JavaFX 编程语 言开发富互联网应用程序(RIA)。JavaFX Script编程语言(以下称为JavaFX)是Sun微...

    JavaFX 2.0 電子書 - Pro JavaFX 2

    最新JavaFx 2.0 電子書 In Pro JavaFX 2: A Definitive Guide to Rich Clients with Java Technology, Jim Weaver, Weiqi Gao, Stephen Chin, Dean Iverson, and Johan Vos show you how you can use the JavaFX ...

    JavaFx2.0入门指南

    开始构建JavaFX应用,你可以选择任何支持Java应用开发的工具,本教程中推荐使用NetBeans IDE。在开始前,确保你使用的NetBeans IDE版本兼容JavaFX 2.0。系统需求和安装步骤可以在Oracle官网找到相应的指导。 以下是...

    javafx 2.0读取_简单表格的案例_oracle数据组装成

    本案例主要关注如何使用JavaFX 2.0来读取数据并展示在简单的表格中,特别是从Oracle数据库中获取数据并进行组装的过程。 首先,我们需要确保已经安装了JavaFX SDK,并且在项目中正确设置了相关的依赖。JavaFX 2.0...

    JavaFX 2.0 Introduction by Example.zip

    JavaFX 2.0 Introduction by Example.zip是javafx2.0的最新书籍《[JavaFX.2.0:Introduction.by.Example].Carl.Dea》上的源码!大家可以下载本书和源码一起看!我都上传了!

    JavaFX2.0基础教程.pdf

    - **JavaFX2.0中支持的UI控件**:详细列举了JavaFX2.0版本中提供的UI控件类型及其用途。 以上是对《JavaFX2.0基础教程》的主要知识点总结,希望能够帮助初学者快速了解JavaFX的基本概念和开发流程。

    javafx_2.0_introduction_by_example

    根据给定文件的信息,我们可以提炼出关于JavaFX 2.0的重要知识点,这些知识点涵盖了JavaFX的基本概念、架构策略、发展历程以及其在图形用户界面(GUI)开发中的应用。 ### JavaFX 2.0:下一代GUI工具包 JavaFX 2.0...

    Javafx 2.0: Introduction by Example

    Javafx 2.0: Introduction by Example

    JavaFX2.0基础教程(整合版)

    JavaFX2.0平台是java客户端设计演进,使应用开发者易于创建和部署跨平台且表现一致的Rich Internet Application(RIAs)。JavafX是由Java技术构建,基于高性能硬件加速的媒体和图形引擎,JavaFX平台提供了一套丰富的...

Global site tag (gtag.js) - Google Analytics