2015-07-05 2 views
2

У меня есть небольшая проблема с моим материалом JavaFX. Я уверен, что вы знаете, что можете получить данные от TextInputDialog с Optional<String> и .showAndWait(). Но что мне делать, когда у меня есть настраиваемый диалог с несколькими TextFields и ChoiceBox? Как получить результаты от всех из них при нажатии кнопки «ОК»? Я думал о List<String>, но я не успел это сделать .. код (пользовательский диалог):Получить несколько результатов из пользовательского диалога [JavaFX]

public class ImageEffectInputDialog extends Dialog { 

    private ButtonType apply = new ButtonType("Apply", ButtonBar.ButtonData.OK_DONE); 
    private ButtonType cancel = new ButtonType("Cancel", ButtonBar.ButtonData.CANCEL_CLOSE); 

    public ImageEffectInputDialog(String title) { 
     setTitle(title); 
     setHeaderText(null); 

     GridPane dPane = new GridPane(); 
     Label offsetX = new Label("Offset X: "); 
     Label offsetY = new Label("Offset Y: "); 
     Label color = new Label("Shadow Color: "); 
     TextField offsetXText = new TextField(); 
     TextField offsetYText = new TextField(); 
     ChoiceBox<String> shadowColors = new ChoiceBox<>(); 
     shadowColors.getItems().add(0, "Black"); 
     shadowColors.getItems().add(1, "White"); 
     dPane.setHgap(7D); 
     dPane.setVgap(8D); 

     GridPane.setConstraints(offsetX, 0, 0); 
     GridPane.setConstraints(offsetY, 0, 1); 
     GridPane.setConstraints(offsetXText, 1, 0); 
     GridPane.setConstraints(offsetYText, 1, 1); 
     GridPane.setConstraints(color, 0, 2); 
     GridPane.setConstraints(shadowColors, 1, 2); 

     dPane.getChildren().addAll(offsetX, offsetY, color, offsetXText, offsetYText, shadowColors); 
     getDialogPane().getButtonTypes().addAll(apply, cancel); 
     getDialogPane().setContent(dPane); 
    } 
} 

код (где я хочу, чтобы результаты)

if(scrollPane.getContent() != null && scrollPane.getContent() instanceof ImageView) { 
    // ImageEffectUtil.addDropShadow((ImageView) scrollPane.getContent()); 
    ImageEffectInputDialog drop = new ImageEffectInputDialog("Drop Shadow"); 
    //Want the Results here.. 
} 

Я надеюсь, что кто-то может помогите мне :)

ответ

2

Прежде всего, чтобы получить разные значения разных типов (общее решение), просто определите новую структуру данных, скажем Result, которая содержит такие поля, как offsetX, offsetY и все, что вам нужно. Затем продолжите Dialog<Result> вместо Dialog. Наконец, в конструкторе ImageEffectInputDialog вам необходимо установить результат преобразователя следующим образом:

setResultConverter(button -> { 
    // here you can also check what button was pressed 
    // and return things accordingly 
    return new Result(offsetXText.getText(), offsetYText.getText()); 
}); 

Теперь везде, где вам нужно использовать диалоговое окно, вы можете сделать:

ImageEffectInputDialog dialog = new ImageEffectInputDialog("Title"); 
    dialog.showAndWait().ifPresent(result -> { 
     // do something with result object, which is of type Result 
    }); 
+0

Хорошо, что действительно полезно: DI никогда бы не придумал эту идею, thx. Думаю, я справился сам, потому что он работает. Но я только хочу это понять. Я имею в виду, что самосозданный DataType 'Result' является логичным, но что именно' setResultConverter() 'точно? Я не тот, кто копирует вещь и не понимает ее, я ХОЧУ понять ее :) – xkev320x

+0

Я бы предложил сначала прочитать javadoc, независимо от вопроса - https://docs.oracle.com/javase/8/javafx /api/javafx/scene/control/Dialog.html. Короче говоря, он принимает естественный результат окончания диалога, который является типом кнопки, потому что вы закрываете диалог, нажимая одну из кнопок. Поскольку вам нужен пользовательский тип данных, т. Е. Результат, JavaFX должен знать, как преобразовать результат типа кнопки в ваш пользовательский результат. Следовательно, setResultConverter(). – AlmasB

+0

Извините, я не читал причины JavaDocs, я понял все вещи JavaFX, которые я делал до сих пор. Я знаю, что это немного глупо, но да: D В любом случае спасибо за вашу помощь :) – xkev320x