【问题标题】:Get more than two inputs in a JavaFX Dialog在 JavaFX 对话框中获取两个以上的输入
【发布时间】:2017-10-24 03:52:22
【问题描述】:

我尝试构建文本对话框,用户可以在其中输入活动名称、活动规模和选择的场地。

我的问题是如何收集输入;这是我到目前为止所做的:

eventName = new TextField();
eventSize = new TextField();
ObservableList<Venue> options = 
            FXCollections.observableArrayList(model.getVenuesList());
VeunueList = new ComboBox<Venue>(options);

我创建了一个类来封装我的所有输入:

public class MyResult {
    String eventname;
    String eventsize;
    Venue venue;
}

我将变量定义为 Myresult 类的对象:

private Dialog<MyResult> dialog ;
private Optional<MyResult> EventInput;

问题是如何在结果转换器中写return语句;它给了我错误:

dialog.setResultConverter(dialogButton -> {
        if (dialogButton == submit) {
            return new MyResult(eventName.getText(),eventSize.getText(),VeunueList.getValue())
        }
        return null;
    });

    EventInput = dialog.showAndWait();

【问题讨论】:

  • 您可以选择VenueList.getValue()。为什么不写一个简单的类来封装这三条数据,而不是丑陋的Pair&lt;Pair&lt;String, String&gt;, String&gt;? (您肯定会想要将这些数据保存在应用程序其他地方的单个对象中的东西吗?)
  • 感谢您的评论,显然我是 Java 新手,我喜欢您将所有数据封装在一个类中的想法,我会尝试这样做,谢谢

标签: java javafx combobox dialog


【解决方案1】:

尚不清楚您的片段哪里出错了,但为调用 setResultConverter() 获取正确的类型有时是有问题的。下面的示例说明了一个Dialog,它从TextFieldDatePickerComboBox&lt;Venue&gt; 收集输入。在ComboBox&lt;Venue&gt;中,Venue的选择来自enum,对应的ComboBox模型是使用枚举的隐式values()方法构造的。 resultConverter 属性的Callback 返回一个新的Results 实例,具有各种视图组件的当前值。 Optional&lt;Results&gt; 显示这些值 ifPresent()。一些相关示例可以在here 和教程中找到,JavaFX improvements in Java SE 8u40.

控制台:Name 2017-05-24 Elsewhere

import java.time.LocalDate;
import java.util.Optional;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.ButtonType;
import javafx.scene.control.ComboBox;
import javafx.scene.control.DatePicker;
import javafx.scene.control.Dialog;
import javafx.scene.control.DialogPane;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

/**
 * @see http://stackoverflow.com/q/44147595/230513
 * @see http://www.javaworld.com/article/2991463/
 */
public class DialogTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        Dialog<Results> dialog = new Dialog<>();
        dialog.setTitle("Dialog Test");
        dialog.setHeaderText("Please specify…");
        DialogPane dialogPane = dialog.getDialogPane();
        dialogPane.getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL);
        TextField textField = new TextField("Name");
        DatePicker datePicker = new DatePicker(LocalDate.now());
        ObservableList<Venue> options =
            FXCollections.observableArrayList(Venue.values());
        ComboBox<Venue> comboBox = new ComboBox<>(options);
        comboBox.getSelectionModel().selectFirst();
        dialogPane.setContent(new VBox(8, textField, datePicker, comboBox));
        Platform.runLater(textField::requestFocus);
        dialog.setResultConverter((ButtonType button) -> {
            if (button == ButtonType.OK) {
                return new Results(textField.getText(),
                    datePicker.getValue(), comboBox.getValue());
            }
            return null;
        });
        Optional<Results> optionalResult = dialog.showAndWait();
        optionalResult.ifPresent((Results results) -> {
            System.out.println(
                results.text + " " + results.date + " " + results.venue);
        });
    }

    private static enum Venue {Here, There, Elsewhere}

    private static class Results {

        String text;
        LocalDate date;
        Venue venue;

        public Results(String name, LocalDate date, Venue venue) {
            this.text = name;
            this.date = date;
            this.venue = venue;
        }
    }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多