JavaFX: сделать ячейку comboBox для динамического изменения состояния отключения - PullRequest
0 голосов
/ 13 июня 2018

За исключением первого элемента, все элементы комбинированного списка изначально отключены (для этого я использовал setCellFactory).

Если я нажму на параметр 0, я хочу, чтобы он разблокировалсяопция 1 и т. д.

Я пытался использовать некоторые логические переменные внутри слушателя comboBox, но кажется, что setCellFactory вызывается только один раз.Это правильно?

Если это так, как я могу достичь того, что хочу?

SSCCE ниже адаптировано из здесь

Main.java

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.stage.Stage;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ListCell;


public class Main extends Application {
    boolean isZeroLocked = false;
    boolean isOneLocked = true;
    boolean isTwoLocked = true;
    boolean isThreeLocked = true;

    @Override
    public void start(Stage stage) throws Exception {
        ComboBox<Integer> box = new ComboBox<Integer>();
        ObservableList<Integer> values = FXCollections.observableArrayList(0,1,2,3);
        box.setItems(values);

        box.getSelectionModel().selectedIndexProperty().addListener((observable,oldValue,newValue)->{
            System.out.println(newValue + " was clicked. The next option will be unlocked.");
            if(newValue.intValue() == 0)
                isOneLocked = false;
            if(newValue.intValue() == 1)
                isTwoLocked = false;
            if(newValue.intValue() == 2)
                isThreeLocked = false;
        });

        box.setCellFactory(lv -> new ListCell<Integer>() {
            @Override
            public void updateItem(Integer item, boolean empty) {
                super.updateItem(item, empty);
                if (empty) {
                    setText(null);
                } else {
                    setText(item.toString());

                    if(item.intValue() == 0)
                        setDisable(isZeroLocked);
                    if(item.intValue() == 1)
                        setDisable(isOneLocked);
                    if(item.intValue() == 2)
                        setDisable(isTwoLocked);
                    if(item.intValue() == 3)
                        setDisable(isThreeLocked);
                }
            }
        });
        Scene scene = new Scene(new Group(box));
        scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

application.css

.combo-box-popup .list-cell:disabled  {
    -fx-opacity: 0.4 ;
}

1 Ответ

0 голосов
/ 13 июня 2018

Я создал объект с именем CustomNumber, чтобы не отставать от свойства disabled.

Код ключа:

Этот код устанавливает текст ComboBox и включает его ячейку.

Callback<ListView<CustomNumber>, ListCell<CustomNumber>> factory = lv -> new ListCell<CustomNumber>() {
    @Override
    protected void updateItem(CustomNumber item, boolean empty) {
        super.updateItem(item, empty);
        if (empty) {
            setText(null);
        } else {
            System.out.println(item.getNum());
            setText(Integer.toString(item.getNum()));                   
            setDisable(item.isDisable());
        }
    }
};  

Этот код получает ячейку под выбранной ячейкой и обновляет свойство отключения

box.getSelectionModel().selectedIndexProperty().addListener((observable,oldValue,newValue)->{            
    if(newValue.intValue() + 1 < box.getItems().size())
    {
        CustomNumber tempCustomNumber = (CustomNumber)box.getItems().get(newValue.intValue() + 1);
        tempCustomNumber.setDisable(false);
        System.out.println(tempCustomNumber.getNum() + " " + tempCustomNumber.isDisable() + " was unlocked.");
        box.getItems().set(newValue.intValue() + 1, tempCustomNumber);
    }
});

Полный код:

import java.util.ArrayList;
import java.util.List;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.stage.Stage;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.util.Callback;


public class Main extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        ComboBox<CustomNumber> box = new ComboBox();
        List<CustomNumber> customNumbers = new ArrayList();
        customNumbers.add(new CustomNumber(0, false));
        customNumbers.add(new CustomNumber(1, true));
        customNumbers.add(new CustomNumber(2, true));
        customNumbers.add(new CustomNumber(3, true));
        ObservableList<CustomNumber> values = FXCollections.observableArrayList(customNumbers);

        box.setItems(values);

        Callback<ListView<CustomNumber>, ListCell<CustomNumber>> factory = lv -> new ListCell<CustomNumber>() {
            @Override
            protected void updateItem(CustomNumber item, boolean empty) {
                super.updateItem(item, empty);
                if (empty) {
                    setText(null);
                } else {
                    System.out.println(item.getNum());
                    setText(Integer.toString(item.getNum()));                   
                    setDisable(item.isDisable());
                }
            }
        };

        box.setCellFactory(factory);
        box.setButtonCell(factory.call(null));
        box.getSelectionModel().selectedIndexProperty().addListener((observable,oldValue,newValue)->{            
            if(newValue.intValue() + 1 < box.getItems().size())
            {
                CustomNumber tempCustomNumber = (CustomNumber)box.getItems().get(newValue.intValue() + 1);
                tempCustomNumber.setDisable(false);
                System.out.println(tempCustomNumber.getNum() + " " + tempCustomNumber.isDisable() + " was unlocked.");
                box.getItems().set(newValue.intValue() + 1, tempCustomNumber);
            }
        });

        Scene scene = new Scene(new Group(box));
        scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

CustomNumber

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javafxapplication9;

/**
 *
 * @author sedrick
 */
public class CustomNumber {
    private int num;
    private boolean disable;

    public CustomNumber(int num, boolean disable) {
        this.num = num;
        this.disable = disable;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public boolean isDisable() {
        return disable;
    }

    public void setDisable(boolean isDisable) {
        this.disable = isDisable;
    }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...