2016-02-17 1 views
2

Я пробовал приведенный ниже код, он отлично работает с событием мыши, но когда я использую ключевое событие i.e ENTER Key на любой кнопке, чем его не показывая результат.Введите ключевое событие, которое не работает с диалогом в Javafx?

Alert alert = new Alert(AlertType.CONFIRMATION); 
alert.setTitle(null); 
alert.setHeaderText(null); 
alert.setGraphic(null); 
alert.setContentText("Choose your option."); 

ButtonType buttonTypeOne = new ButtonType("One"); 
ButtonType buttonTypeTwo = new ButtonType("Two"); 
ButtonType buttonTypeThree = new ButtonType("Three"); 

alert.getButtonTypes().setAll(buttonTypeOne, buttonTypeTwo, buttonTypeThree); 

Optional<ButtonType> result = alert.showAndWait(); 
if (result.get() == buttonTypeOne) { 
    System.out.println("One"); 
} else if (result.get() == buttonTypeTwo) { 
    System.out.println("Two"); 
} else if (result.get() == buttonTypeThree) { 
    System.out.println("Three"); 
} 

ответ

1

Я не знаю, если это не вид слишком много обходной путь, но, по крайней мере, это работает:

import javafx.event.EventHandler; 
import javafx.scene.control.Button; 
import javafx.scene.input.KeyCode; 
import javafx.scene.input.KeyEvent; 

    [...] 
ButtonType buttonTypeTwo = new ButtonType("Two"); 
ButtonType buttonTypeThree = new ButtonType("Three"); 

alert.getButtonTypes().setAll(buttonTypeOne, buttonTypeTwo, buttonTypeThree); 

//Create a button for every ButtonType you add to your alert and give it a Eventhandler 
Button button1 = (Button) alert.getDialogPane().lookupButton(buttonTypeOne); 
Button button2 = (Button) alert.getDialogPane().lookupButton(buttonTypeTwo); 
Button button3 = (Button) alert.getDialogPane().lookupButton(buttonTypeThree); 


button1.setOnKeyReleased(new EventHandler<KeyEvent>() { 
    @Override 
    public void handle(KeyEvent event) { 
     if(event.getCode() == KeyCode.ENTER) 
    alert.setResult(buttonTypeOne);  
    } 
}); 
button2.setOnKeyReleased(new EventHandler<KeyEvent>() { 
    @Override 
    public void handle(KeyEvent event) { 
     if(event.getCode() == KeyCode.ENTER) 
    alert.setResult(buttonTypeTwo);  
    } 
}); 
button3.setOnKeyReleased(new EventHandler<KeyEvent>() { 
    @Override 
    public void handle(KeyEvent event) { 
     if(event.getCode() == KeyCode.ENTER) 
    alert.setResult(buttonTypeThree);  
    } 
}); 
//go ahead with your code 
Optional<ButtonType> result = alert.showAndWait(); 
[...] 

Вы просто создать несколько кнопок и назначены их фактические кнопки ваше предупреждение. На следующем шаге вы можете дать каждой кнопке EventHandler, которая просто (в этом примере) проверяет - когда какая-либо клавиша освобождается - если клавиша была нажата ENTER и задал результат.

Я думаю, что для этого есть лучшие решения. Но это самый простой способ, который приходит мне на ум. Надеюсь, это поможет вам.

+0

его не работает –

6

Я не рекомендую, чтобы все кнопки отвечали на , введите, поскольку это противоречит тому, как работает большинство диалоговых окон пользовательского интерфейса.

Обычно кнопка с фокусом будет срабатывать при нажатии пространства, не ввести. Однако есть специальные кнопки, которые активируются на определенных клавишах: A default button будет стрелять по введите и cancel button будет стрелять по esc. Обычно в вашем диалоговом окне вы будете иметь только один из этих специальных типов кнопок, чтобы их можно было запускать с помощью специального ускорителя клавиатуры, независимо от того, какая кнопка в данный момент имеет фокус.

Кроме того, различные системы настольных ОС имеют разные стандарты размещения кнопок по умолчанию и отмены в диалоговой системе. Это поможет пользователю легко найти эти специальные кнопки в любом диалоговом окне. Диалоговая система JavaFX реализует некоторую логику для локализации кнопок в диалогах, где пользователь будет ожидать их просмотра в разных настольных операционных системах.

Допустим, вы хотите типы кнопок из вашего примера, чтобы определить по умолчанию или отменить кнопки и помещен в правильном положении для таких кнопок для вашей операционной системы, то вы можете сделать, как показано ниже:

ButtonType buttonTypeTwo = new ButtonType(
    "Two", 
    ButtonBar.ButtonData.OK_DONE 
); 
ButtonType buttonTypeThree = new ButtonType(
    "Three", 
    ButtonBar.ButtonData.CANCEL_CLOSE 
); 

Примечания система JavaFX автоматически изменила положение кнопок и некоторые цвета подсветки. Когда пользователь нажимает , введите, затем «Два» сработает, когда пользователь нажмет esc, затем будет стрелять «Три». Если вы запускаете тот же код в Windows или Linux, вероятно, кнопки будут расположены по-разному, в соответствии с тем, какой стандарт позиционирования кнопок используется для этих ОС.

enter image description here

Если вы не хотите, JavaFX, чтобы изменить свои кнопки в соответствии со стандартами ОС, но вы хотите, чтобы они по-прежнему отвечать на ввести и ESČ ключей, то вы можете поиск кнопок и непосредственно изменять атрибуты кнопки, как показано ниже:

Button buttonTwo = (Button) alert.getDialogPane().lookupButton(buttonTypeTwo); 
buttonTwo.setDefaultButton(true); 
Button buttonThree = (Button) alert.getDialogPane().lookupButton(buttonTypeThree); 
buttonThree.setCancelButton(true); 

adjusted button types

I recomme позволяя JavaFX правильно позиционировать кнопки определенных типов, а не выполнять поиск, как указано выше.

Я также рекомендую установить хотя бы кнопку CANCEL_CLOSE или кнопку OK_DONE в вашем предупреждении JavaFX, иначе у пользователя может быть трудное время, фактически закрывающее предупреждение, поскольку диалог, вероятно, не будет реагировать на нажатия клавиш, как ожидает пользователь.

+0

Это было полезное объяснение. – Arceus

0

Здесь, как я решил. он работает отлично, это моя функция подтверждения предупреждения.

public static boolean confirmAlert(String title, String msg){ 

     ButtonType buttonTypeYes = new ButtonType("Yes", ButtonBar.ButtonData.OK_DONE); 
     ButtonType buttonTypeNo = new ButtonType("No",ButtonBar.ButtonData.CANCEL_CLOSE); 

     Alert alert = new Alert(Alert.AlertType.NONE, msg,buttonTypeNo,buttonTypeYes); 
     alert.setTitle(title); 

     Button button1 = (Button) alert.getDialogPane().lookupButton(buttonTypeYes); 
     button1.setDefaultButton(false); //***set default to false*** 

     Button button2 = (Button) alert.getDialogPane().lookupButton(buttonTypeNo); 

     button1.setOnKeyReleased(event -> { 
      if(event.getCode() == KeyCode.ENTER) 
       alert.setResult(buttonTypeYes); 
     }); 
     button2.setOnKeyReleased(event -> { 
      if(event.getCode() == KeyCode.ENTER) 
       alert.setResult(buttonTypeNo); 
     }); 
     alert.showAndWait(); 
     return alert.getResult()==buttonTypeYes; 
    }