簡體   English   中英

在javafx中的選擇對話框中查找單擊了哪個按鈕

[英]Find which button is clicked in choice Dialog in javafx

如何在此對話框中找到單擊的按鈕,並獲取選項選項。

我需要一個輸出,如果單擊DebugOk獲取選擇bok選擇值和單擊哪個按鈕。 我在這里輸入了這個輸入鏈接描述並更改了我的代碼

    Optional<ButtonType> optional = choice.showAndWait();
    if (optional.isPresent()) { 
        System.out.println(optional.get().getButtonData());

    } 

我會得到這個錯誤

Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: java.lang.String cannot be cast to javafx.scene.control.ButtonType
at choicedialogfx.ChoiceDialogFX.choiceInputDialog(ChoiceDialogFX.java:74)
at choicedialogfx.ChoiceDialogFX$1.handle(ChoiceDialogFX.java:43)
at choicedialogfx.ChoiceDialogFX$1.handle(ChoiceDialogFX.java:39)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)

這是我的示例代碼

    public class ChoiceDialogFX extends Application {

    @Override
    public void start(Stage primaryStage) {
    List<String> list = new ArrayList<>();
    list.add("/dev/ttyUSB0");
    list.add("/dev/ttyS0");
    list.add("/dev/ttyS1");
    list.add("/dev/ttyS2");

    Button btn = new Button();
    btn.setText("ChoiceDialog");
    btn.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {
            choiceInputDialog("Test", "Port Select", "Choice", list);
        }
    });

    StackPane root = new StackPane();
    root.getChildren().add(btn);

    Scene scene = new Scene(root, 300, 250);

    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
    launch(args);
    }

    public String choiceInputDialog(String title, String headerText, String contentText, List choices) {
    Object defaultChoice = choices.get(0);
    Collection<String> collection = choices;
    ChoiceDialog choice = new ChoiceDialog(defaultChoice, collection);
    addCheckBox(choice);
    choice.setTitle(title);
    choice.setHeaderText(headerText);
    choice.setContentText(contentText);
    Optional<ButtonType> optional = choice.showAndWait();
    if (optional.isPresent()) {
        System.out.println(optional.get());

    } 
    return null;
    }

    private void addCheckBox(ChoiceDialog choice) {
    ButtonType buttonType = new ButtonType("Debug", ButtonData.HELP);
    choice.getDialogPane().getButtonTypes().add(buttonType);
    }
}

在此輸入圖像描述

如果您已為ChoiceDialog指定了確切的類型,則編碼時遇到的問題會更少。 而不僅僅是

ChoiceDialog choice = new ChoiceDialog( defaultChoice, collection );

ChoiceDialog<String> choice = new ChoiceDialog( defaultChoice, collection );

這里我們將類型T設置為String ,其中T

T - 要向用戶顯示的項的類型,以及在解除對話框時通過ChoiceDialog.getResult()返回的類型。

換句話說,我們希望向用戶顯示字符串選項,並在用戶單擊其中一個按鈕時返回字符串。 請注意,對於“取消”,它將為null。

下一個。 您想從對話框中返回2個值,
1.用戶從組合框中選擇的值
2.用戶點擊的按鈕類型

由於我們只返回一個字符串值,因此天真的解決方案將返回上面的合並值2,並將它們拆分為客戶端代碼。 更強大的解決方案是將類型安全對象設置為上面的Type of ChoiceDialog,或者自己設置Dialog的自定義內容(請參閱自定義登錄對話框示例 )。

天真的解決方案:

public String choiceInputDialog( String title, String headerText, String contentText, List choices )
{
    ChoiceDialog<String> choice = new ChoiceDialog( choices.get( 0 ), choices );
    addCheckBox( choice );

    choice.setResultConverter( ( ButtonType type ) ->
    {
        ButtonBar.ButtonData data = type == null ? null : type.getButtonData();
        if ( data == ButtonBar.ButtonData.HELP )
        {
            return "DEBUG@" + choice.getSelectedItem();
        }
        else if ( data == ButtonBar.ButtonData.OK_DONE )
        {
            return "OK@" + choice.getSelectedItem();
        }
        else
        {
            return null;
        }
    } );

    choice.setTitle( title );
    choice.setHeaderText( headerText );
    choice.setContentText( contentText );
    Optional<String> result = choice.showAndWait();
    if ( result.isPresent() )
    {
        System.out.println( "result: " + Arrays.toString( result.get().split( "@" ) ) );
    }
    return null;
}

編輯:

實際上你可以通過選擇項目

choice.getSelectedItem();

所以你可能更喜歡只返回點擊按鈕的文本。 就像是

Optional<String> result = choice.showAndWait();
if ( result.isPresent() )
{
    System.out.println( "button text = " + result.get() );
    System.out.println( "choice = " + choice.getSelectedItem());
} 

哪里

choice.setResultConverter( ( ButtonType type ) ->
{
    ButtonBar.ButtonData data = type == null ? null : type.getButtonData();
    if ( data == ButtonBar.ButtonData.HELP )
    {
        return "DEBUG";
    }
    else if ( data == ButtonBar.ButtonData.OK_DONE )
    {
        return "OK";
    }
    else
    {
        return null;
    }
} );

暫無
暫無

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

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