ListView

Последнее обновление: 22.06.2018

Класс javafx.scene.control.ListView<T> позволяет создавать списки. ListView является обобщенным типом. То есть в зависимости от того, объекты какого типа должен хранить ListView, мы можем его типировать тем или иным типом.

Для создания ListView могут применяться два конструктора:

  • ListView(): создает пустой список

  • ListView​(ObservableList<T> items): создает список, наполненный элементами items

Создадим простейший список:

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.FlowPane;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.collections.ObservableList;
import javafx.collections.FXCollections;
 
public class Main extends Application{
	
    public static void main(String[] args) {
         
        Application.launch(args);
    }
     
    @Override
    public void start(Stage stage) throws Exception {
         
		// создаем список объектов
		ObservableList<String> langs = FXCollections.observableArrayList("Java", "JavaScript", "C#", "Python");
		ListView<String> langsListView = new ListView<String>(langs);
		
		FlowPane root = new FlowPane(langsListView);
        Scene scene = new Scene(root, 250, 200);
         
        stage.setScene(scene);
        stage.setTitle("ListView in JavaFX");
        stage.show();
    }
}
ListView in JavaFX

По умолчанию ListView занимает некоторые стандартные размеры, которые не всегда могут будь удобны. В этом случае мы можем использовать ряд методов для установки длины и ширины:

  • void setPrefHeight(double height): задает предпочтительную высоту

  • void setPrefWidth(double width): задает предпочтительную ширину

  • void setPrefSize(double width, double height): задает предпочтительные ширину и высоту

Получение выбранных элементов

Для получения выбранных в ListView элементов необходимо обратиться в ListView к методу

final MultipleSelectionModel<T> getSelectionModel()

Этот метод возвращает объект MultipleSelectionModel - модель, которая отслеживает выбранные элементы. Этот объект определяет метод selectedItemProperty(), который возвращает объект ReadOnlyObjectProperty. И с помощью метода addListener() у ReadOnlyObjectProperty можно установить слушатель, который будет отслеживать изменения выбранных элементов:

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.FlowPane;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.collections.ObservableList;
import javafx.collections.FXCollections;

import javafx.geometry.Orientation;
import javafx.beans.value.ObservableValue;
import javafx.beans.value.ChangeListener;
import javafx.scene.control.MultipleSelectionModel;
 
public class Main extends Application{
	
    public static void main(String[] args) {
         
        Application.launch(args);
    }
     
    @Override
    public void start(Stage stage) throws Exception {
         
        Label selectedLbl = new Label();
		// создаем список объектов
		ObservableList<String> langs = FXCollections.observableArrayList("Java", "JavaScript", "C#", "Python");
		ListView<String> langsListView = new ListView<String>(langs);
		langsListView.setPrefSize(250, 150);
		// получаем модель выбора элементов
		MultipleSelectionModel<String> langsSelectionModel = langsListView.getSelectionModel();
		// устанавливаем слушатель для отслеживания изменений
		langsSelectionModel.selectedItemProperty().addListener(new ChangeListener<String>(){
			
			public void changed(ObservableValue<? extends String> changed, String oldValue, String newValue){
				
				selectedLbl.setText("Selected: " + newValue);
			}
		});
		
		FlowPane root = new FlowPane(Orientation.VERTICAL, 10, 10, selectedLbl, langsListView);
		Scene scene = new Scene(root, 250, 200);
         
        stage.setScene(scene);
        stage.setTitle("ListView in JavaFX");
        stage.show();
    }
}

Здесь вначале получаем модель выбора элементов - MultipleSelectionModel<String>. Причем поскольку в списке хранятся объекты String, то MultipleSelectionModel тоже типизируется типом String.

Затем прикрепляем слушатель, который будет отслеживать изменения выбора элементов. Слушатель представляет тип, который реализует интерфейс ChangeListener. Причем интерфейс также типизируется типом хранимых в списке объектов - типом String.

В методе changed этого интерфейса с помощью параметра newValue мы можем получить новое выбранное значение и что-то с ним сделать, например, отобразить на метке. Также можно получить ранее выбранное значение через параметр oldValue.

Выбор элементов в ListView в JavaFX

Множественное выделение

По умолчанию ListView позволяет выбирать одномоментно только один элемент, однако мы можем установить выбор нескольких элементов. Для этого применяется метод

final void setSelectionMode(SelectionMode mode)

В метод передается значение из перечисления javafx.scene.control.SelectionMode: SelectionMode.MULTIPLE (множественный выбор) или SelectionMode.SINGLE (одиночный выбор - по умолчанию).

Например, используем множественный выбор:

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.FlowPane;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.MultipleSelectionModel;
import javafx.collections.ObservableList;
import javafx.collections.FXCollections;

import javafx.geometry.Orientation;
import javafx.beans.value.ObservableValue;
import javafx.beans.value.ChangeListener;
 
public class Main extends Application{
	
    public static void main(String[] args) {
         
        Application.launch(args);
    }
     
    @Override
    public void start(Stage stage) throws Exception {
         
        Label selectedLbl = new Label();
		
		// создаем список объектов
		ObservableList<String> langs = FXCollections.observableArrayList("Java", "JavaScript", "C#", "Python");
		ListView<String> langsListView = new ListView<String>(langs);
		langsListView.setPrefSize(250, 150);
		
		// получаем модель выбора элементов
		MultipleSelectionModel<String> langsSelectionModel = langsListView.getSelectionModel();
		langsSelectionModel.setSelectionMode(SelectionMode.MULTIPLE);
		
		// устанавливаем слушатель для отслеживания изменений
		langsSelectionModel.selectedItemProperty().addListener(new ChangeListener<String>(){
			
			public void changed(ObservableValue<? extends String> changed, String oldValue, String newValue){
				
				String selectedItems = "";
				ObservableList<String> selected = langsSelectionModel.getSelectedItems();
				for (String item : selected){
					selectedItems += item + " ";
 				}
				selectedLbl.setText("Selected: " + selectedItems);
			}
		});
		
		FlowPane root = new FlowPane(Orientation.VERTICAL, 10, 10, selectedLbl, langsListView);
		
        Scene scene = new Scene(root, 250, 200);
         
        stage.setScene(scene);
        stage.setTitle("ListView in JavaFX");
        stage.show();
    }
}

Чтобы получить все выделенные элементы, мы можем обратиться к методу getSelectedItems() объекта SelectionModel.

Множественный выбор в ListView в JavaFX

Динамическое изменение ListView

После того, как для ListView установлен источник данных в виде коллекции ObservableList, все операции по добавлению новых элементов в ListView или удалению старых производятся только с ObservableList. Поскольку этот интерфейс наследует базовый для всех коллекций интерфейс Collection, то для добавления и удаления в ObservableList мы можем использовать методы add() и remove() соответственно:

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.FlowPane;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.control.ListView;
import javafx.collections.ObservableList;
import javafx.collections.FXCollections;
import javafx.geometry.Orientation;
 
public class Main extends Application{
	
    public static void main(String[] args) {
         
        Application.launch(args);
    }
     
    @Override
    public void start(Stage stage) throws Exception {
         
        TextField textField = new TextField();
		
		ObservableList<String> langs = FXCollections.observableArrayList("Java", "JavaScript", "C#", "Python");
		ListView<String> langsListView = new ListView<String>(langs);
		langsListView.setPrefSize(250, 150);
		
		Button addBtn = new Button("Add");
		Button deleteBtn = new Button("Delete");
		FlowPane buttonPane = new FlowPane(10, 10, textField, addBtn, deleteBtn);
		
		addBtn.setOnAction(event -> langs.add(textField.getText()));
		deleteBtn.setOnAction(event -> langs.remove(textField.getText()));
		
		FlowPane root = new FlowPane(Orientation.VERTICAL, 10, 10, buttonPane, langsListView);
		
        Scene scene = new Scene(root, 300, 250);
         
        stage.setScene(scene);
        stage.setTitle("ListView in JavaFX");
        stage.show();
    }
}
Изменение элементов в ListView в JavaFX

В данном случае мы изменяем элементы в источнике данных, к которому привязан ListView. Однако мы можем полностью поменять источник данных с помощью метода setItems(ObservableList collection):

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.FlowPane;
import javafx.scene.control.Button;
import javafx.scene.control.ListView;
import javafx.collections.ObservableList;
import javafx.collections.FXCollections;
import javafx.geometry.Orientation;
 
public class Main extends Application{
	
    public static void main(String[] args) {
         
        Application.launch(args);
    }
     
    @Override
    public void start(Stage stage) throws Exception {
         
        ObservableList<String> langs = FXCollections.observableArrayList("Java", "JavaScript", "C#", "Python");
		ListView<String> langsListView = new ListView<String>(langs);
		langsListView.setPrefSize(250, 150);
		
		Button btn = new Button("Change");
		
		btn.setOnAction(event -> {
			
			ObservableList<String> newLangs = FXCollections.observableArrayList("PHP", "Go", "C++");
			langsListView.setItems(newLangs);
		});
		
		FlowPane root = new FlowPane(Orientation.VERTICAL, 10, 10, btn, langsListView);
        Scene scene = new Scene(root, 300, 250);
         
        stage.setScene(scene);
        stage.setTitle("ListView in JavaFX");
        stage.show();
    }
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850