簡體   English   中英

JavaFx:ComboBox編輯器的文本

[英]JavaFx: ComboBox editor's text

我正在使用此答案中建議的comboBox: JavaFx:顯示DatePicker ,但是顯示正確的文本時出現問題。 如果我從DatePicker中選擇一個日期,我會嘗試設置編輯器的文本,但不會發生任何事情。 這是我嘗試過的:

getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) ->{
    if (newValue != null) {
        if (MyTupe.DATE.equals(newValue.getType())) {
            initDatePicker();
            datePicker.valueProperty().addListener((obs, oldDate, newDate) -> {
                newValue.setValue(newDate);
                getEditor().setText(newDate.toString());
                datePopOver.hide();
            });
            StackPane stackPane = new StackPane(datePicker);
            stackPane.setPadding(new Insets(10, 10, 10, 10));

            datePopOver.setContentNode(stackPane);
            datePopOver.show(this);
        } else {
            datePopOver.hide();
        }
    }
});

經過大量實驗后,我將兩個事件添加到編輯器的textProperty和setOnMouseClicked中,如下所示:

getEditor().textProperty().addListener((observable, oldValue, newValue) -> {
    System.out.println("Text changed");
});
setOnMouseClicked(event -> {
    System.out.println(getEditor().getText());
});

如果我不手動設置,則不會觸發getEditor().setText(); 即使我更改comboBox的值,這對我來說還是有點奇怪,因為我認為此textField可以保存comboBox的文本。(也許我錯了嗎?)。 每次刪除空白行時,都會顯示mouseClick事件。 如果getEditor().setText(); 編輯器的getText()返回正確的文本行,但不會顯示在comboBox中。

問題:

  • comboBox的文本存儲在哪里?
  • 如何更改selectedItemProperty的偵聽器中的文本?

我認為也許我在某個地方犯了一個錯誤,所以這就是為什么它不起作用,但是我不知道該怎么辦,您能幫我嗎?

在鏈接的代碼中

更換:

items.set(0, new ComboBoxNode(newDate, DATE_TYPE));

與:

items.set(customComboBox.getSelectionModel().getSelectedIndex(), new ComboBoxNode(newDate, DATE_TYPE));

鏈接的代碼僅更改零位置的日期。 在此新代碼中,適當位置的日期已更改。

完整代碼:

import java.time.LocalDate;
import java.time.Month;
import java.util.Objects;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.DatePicker;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import org.controlsfx.control.PopOver;

/**
 *
 * @author blj0011
 */
public class JavaFXApplication155 extends Application
{

    private static final String DATE_TYPE = "DATE";

    private class ComboBoxNode {
        private final Object value;
        private final String type;

        private ComboBoxNode(final Object value, final String type) {
            this.value = value;
            this.type = type;
        }

        @Override
        public String toString() {
            return Objects.toString(value);
        }
    }

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

    @Override
    public void start(Stage primaryStage) {
        final ObservableList<ComboBoxNode> items =
                FXCollections.observableArrayList(
                        new ComboBoxNode(LocalDate.now(), DATE_TYPE),
                        new ComboBoxNode(LocalDate.of(2017, Month.APRIL, 15), DATE_TYPE),//Added new date to ComboBox
                        new ComboBoxNode("11:35AM", "TIME"));

        final PopOver datePopOver = new PopOver();
        datePopOver.setTitle("Enter new date");
        datePopOver.setCornerRadius(10);
        datePopOver.setHeaderAlwaysVisible(true);
        //datePopOver.set(true);
        datePopOver.setAutoHide(true);

        final ComboBox<ComboBoxNode> customComboBox = new ComboBox<>(items);


        customComboBox.getSelectionModel().selectedItemProperty().addListener((o, old, newNode) -> {
            if (newNode != null) {
                if (newNode.type.equals(DATE_TYPE)) {
                    final DatePicker datePicker = new DatePicker((LocalDate) newNode.value);
                    datePicker.valueProperty().addListener((obs, oldDate, newDate) -> {
                        items.set(customComboBox.getSelectionModel().getSelectedIndex(), new ComboBoxNode(newDate, DATE_TYPE));//Fixed this line of code
                        datePopOver.hide();
                    });

                    final StackPane stackPane = new StackPane(datePicker);
                    stackPane.setPadding(new Insets(10, 10, 10, 10));

                    datePopOver.setContentNode(stackPane);
                    datePopOver.show(customComboBox);
                } else {
                    datePopOver.hide();
                }
            }
        });

        final FlowPane pane = new FlowPane(customComboBox);
        pane.setPadding(new Insets(10, 10, 10, 10));
        pane.setPrefWidth(400);
        pane.setPrefHeight(300);

        // Show Scene
        final Scene scene = new Scene(pane);
        primaryStage.setTitle("Popup calendar");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

關於您的問題:comboBox的文本存儲在哪里? 通常,JavaFX控件基於MVC架構,其中數據存儲在模型中。 控件僅根據定義的轉換器表示模型數據,並對模型的任何更改自動做出反應。

因此,在您的情況下,數據存儲在ObservableList items 要更新組合框,您只需要用新對象替換相應的項目即可。

注意,組合框已經在監聽ObservableList並且任何添加/刪除/設置都將自動在UI端表示。

為什么此代碼不起作用:

newValue.setValue(newDate);

因為您更改了項目的內部狀態,並且ObservableList items對這種更改不起作用。 僅列表的更改將起作用。 @Sedrick提出了正確的解決方案。

另請參閱相關問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM