JavaFX ListView单元格的鼠标悬停特效以及拖拉排序

ListView特效

要实现ListView单元格的鼠标悬停特效同样要使用Listview.setCellFactory(Callback<ListView, ListCell> value)工厂方法,新建一个ListCell编写ListCell.hoverProperty().addListener(ChangeListener<? super Boolean> listener)实现鼠标悬听的监听事件。

listview.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
			int position = 0;
			String positionstr = "";
			@Override
			public ListCell<String> call(ListView<String> param) {
				// TODO Auto-generated method stub
				Label label = new Label();
				
				ListCell<String> cell = new ListCell<String>(){
					
					@Override
					protected void updateItem(String item, boolean empty) {
						
						super.updateItem(item, empty);
						
						if(empty == false){
							label.setText(item);
							label.setPrefHeight(20);
							label.setFont(new Font(15.0));
							this.setGraphic(label);
						}
					}
					
				};
				cell.hoverProperty().addListener(new ChangeListener<Boolean>() {

					@Override
					public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue,
							Boolean newValue) {
						if(newValue == true && label.getText().equals("") != true){
							position = param.getItems().indexOf(label.getText());
							label.setPrefHeight(40.0);
							label.setFont(new Font(22));
							param.getFocusModel().focus(position);
						}else{
							label.setPrefHeight(20);
							label.setFont(new Font(15.0));
						}
						
					}
				});
			return cell;
			}
		});

要实现拖拉排序首先获取点击的元素位置,使用listview.getSelectionModel().selectedIndexProperty().addListener()或者listview.getSelectionModel().selectedItemProperty().addListener()获取选中元素或者索引。通过cell.setOnDragDetected()创建拖拉面板将选中元素添加进入。

		listview.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
			int position = 0;
			String positionstr = "";
			@Override
			public ListCell<String> call(ListView<String> param) {
				// TODO Auto-generated method stub
				Label label = new Label();
				
				ListCell<String> cell = new ListCell<String>(){
					
					@Override
					protected void updateItem(String item, boolean empty) {
						
						super.updateItem(item, empty);
						
						if(empty == false){
							label.setText(item);
							label.setPrefHeight(20);
							label.setFont(new Font(15.0));
							this.setGraphic(label);
						}
					}
					
				};
				cell.hoverProperty().addListener(new ChangeListener<Boolean>() {

					@Override
					public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue,
							Boolean newValue) {
						if(newValue == true && label.getText().equals("") != true){
							position = param.getItems().indexOf(label.getText());
							label.setPrefHeight(40.0);
							label.setFont(new Font(22));
							param.getFocusModel().focus(position);
						}else{
							label.setPrefHeight(20);
							label.setFont(new Font(15.0));
						}
						
					}
				});
				//设置如何处理拖拽元素,先删除拖拽位置元素,再将其添加在拖拽位置
				cell.setOnDragDropped(new EventHandler<DragEvent>() {

					@Override
					public void handle(DragEvent event) {
						// TODO Auto-generated method stub
						if(position == -1){
							position = param.getItems().size()-1;
						}
						 String value = event.getDragboard().getString();
						 param.getItems().remove(index);
						 param.getItems().add(position,value);
						 System.out.println(value);
						 param.getSelectionModel().select(position);
					}
				});
				
				cell.setOnDragOver(new EventHandler<DragEvent>() {

					@Override
					public void handle(DragEvent event) {
						// TODO Auto-generated method stub
						event.acceptTransferModes(TransferMode.MOVE);
						
					}
				});
				//实时获取拖拽位置
				cell.setOnDragEntered(new EventHandler<DragEvent>() {

					@Override
					public void handle(DragEvent event) {
						// TODO Auto-generated method stub
						position = param.getItems().indexOf(label.getText());
						positionstr = label.getText();
						param.getFocusModel().focus(position);//得到焦点
						
						//System.out.println(position + "-" + label.getText() );
					}
				});
				//创建拖拽面板加入选中拖拽元素
				cell.setOnDragDetected(new EventHandler<MouseEvent>() {

					@Override
					public void handle(MouseEvent event) {
						Dragboard db = cell.startDragAndDrop(TransferMode.MOVE);
						ClipboardContent content = new ClipboardContent();
						content.putString(data);
						db.setContent(content);
					}
				});
		
				return cell;
			}
		});

全部代码

package com.fx;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.DragEvent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.Callback;

public class ListViewTest extends Application{
	int index;
	String data;
	public static void main(String[] args){
		launch(args);
	}
	@Override
	public void start(Stage primaryStage) throws Exception {
		// TODO Auto-generated method stub
		AnchorPane an = new AnchorPane();
		String s1 = "A先生-18-男";
		String s2 = "B先生-18-男";
		String s3 = "C先生-18-男";
		String s4 = "D先生-18-男";
		ObservableList<String> list = FXCollections.observableArrayList();	
		list.addAll(s1,s2,s3,s4);

		ListView<String> listview = new ListView<String>();
		//占位符 当listview没有数据时显示占位符
		listview.setPlaceholder(new Label("没有数据"));
		//添加一个可观测的列表显示
		listview.setItems(list);
		listview.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
			int position = 0;
			String positionstr = "";
			@Override
			public ListCell<String> call(ListView<String> param) {
				// TODO Auto-generated method stub
				Label label = new Label();
				
				ListCell<String> cell = new ListCell<String>(){
					
					@Override
					protected void updateItem(String item, boolean empty) {
						
						super.updateItem(item, empty);
						
						if(empty == false){
							label.setText(item);
							label.setPrefHeight(20);
							label.setFont(new Font(15.0));
							this.setGraphic(label);
						}
					}
					
				};
				cell.hoverProperty().addListener(new ChangeListener<Boolean>() {

					@Override
					public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue,
							Boolean newValue) {
						if(newValue == true && label.getText().equals("") != true){
							position = param.getItems().indexOf(label.getText());
							label.setPrefHeight(40.0);
							label.setFont(new Font(22));
							param.getFocusModel().focus(position);
						}else{
							label.setPrefHeight(20);
							label.setFont(new Font(15.0));
						}
						
					}
				});
				//设置如何处理拖拽元素,先删除拖拽位置元素,再将其添加在拖拽位置
				cell.setOnDragDropped(new EventHandler<DragEvent>() {

					@Override
					public void handle(DragEvent event) {
						// TODO Auto-generated method stub
						if(position == -1){
							position = param.getItems().size()-1;
						}
						 String value = event.getDragboard().getString();
						 param.getItems().remove(index);
						 param.getItems().add(position,value);
						 System.out.println(value);
						 param.getSelectionModel().select(position);
					}
				});
				
				cell.setOnDragOver(new EventHandler<DragEvent>() {

					@Override
					public void handle(DragEvent event) {
						// TODO Auto-generated method stub
						event.acceptTransferModes(TransferMode.MOVE);
						
					}
				});
				//实时获取拖拽位置
				cell.setOnDragEntered(new EventHandler<DragEvent>() {

					@Override
					public void handle(DragEvent event) {
						// TODO Auto-generated method stub
						position = param.getItems().indexOf(label.getText());
						positionstr = label.getText();
						param.getFocusModel().focus(position);//得到焦点
						
						//System.out.println(position + "-" + label.getText() );
					}
				});
				//创建拖拽面板加入选中拖拽元素
				cell.setOnDragDetected(new EventHandler<MouseEvent>() {

					@Override
					public void handle(MouseEvent event) {
						Dragboard db = cell.startDragAndDrop(TransferMode.MOVE);
						ClipboardContent content = new ClipboardContent();
						content.putString(data);
						db.setContent(content);
					}
				});
		
				return cell;
			}
		});
		//设置单元格尺寸 
		listview.setFixedCellSize(50);
	
		an.getChildren().addAll(listview);
		AnchorPane.setTopAnchor(listview, 50.0);
		AnchorPane.setLeftAnchor(listview, 30.0);
		Scene scene = new Scene(an);
		primaryStage.setScene(scene);
		primaryStage.setTitle("javafx");
		primaryStage.setHeight(500);
		primaryStage.setWidth(500);
		primaryStage.show();
		listview.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {

			@Override
			public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
				// TODO Auto-generated method stub
				
				index = newValue.intValue();
				//System.out.println(index);
			}
		});
		listview.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() {

			@Override
			public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
				// TODO Auto-generated method stub
				data = newValue;
			}
		});
	}

}

学习至B站up主Aimls

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值