JavaFX在按下指定键后运行一个方法

JavaFX在按下指定键后运行一个方法,javafx,keypress,Javafx,Keypress,我试图在使用KeyListener按下指定键后,在指定给特定任务的控制器类中运行一个方法。但是我无法检测按键并调用java.awt.event keyPressed方法。我的代码如下: public class POSController implements KeyListener { @Override public void keyPressed(java.awt.event.KeyEvent e) { if (e.getKeyCode() == com.sun.glass.ev

我试图在使用KeyListener按下指定键后,在指定给特定任务的控制器类中运行一个方法。但是我无法检测按键并调用
java.awt.event keyPressed
方法。我的代码如下:

public class POSController implements KeyListener {

@Override
public void keyPressed(java.awt.event.KeyEvent e) {
    if (e.getKeyCode() == com.sun.glass.events.KeyEvent.VK_F1) {
        try {
            paymentAction();
         } catch (Exception e1) {
            e1.printStackTrace();
       }
     }
  }
}
可能出了什么问题?提前谢谢

下面是这个问题的最小可执行示例

public class POSController implements KeyListener {

@FXML
private TableView<Product> productTableView;
@FXML
private TableView<Item> listTableView;
@FXML
private MenuItem logoutItem, profile;
@FXML
private javafx.scene.image.ImageView backImage;
@FXML
private MenuButton menuButton;
@FXML
private TableColumn<Item, String> itemColumn;
@FXML
private ComboBox<String> clientId, paymentMethod;
@FXML
private TableColumn<Item, Double> priceColumn, totalColumn, discountPercentageColumn, amountColumn;
@FXML
private TableColumn<Item, Integer> quantityColumn;
@FXML
private TableColumn<Product, String> productColumn;
@FXML
private TextField searchField,discountPercentage,productField,priceField,quantityField,vatPercentage,subTotalField,discountField,totalVatField,vatField,netPayableField,totalDiscountField;
@FXML
private TextField ;
@FXML
private TextField ;
@FXML
private TextField ;
@FXML
private TextField ;
@FXML
private TextArea descriptionArea;
@FXML
private Button addButton, removeButton, paymentButton, resetTableButton, resetButton;
@FXML
private Label quantityLabel, errorLabel, userName, backLabel;
@FXML
private ObservableList<Item> ITEMLIST;

public static Scene paymentScene;
private double xOffset = 0;
private double yOffset = 0;
public static double finalNetPayablePrice = 0.0;
public static double finalSubTotalPrice = 0.0;
public static double finalVat = 0.0;
public static double finalDiscount = 0.0;
public static String clientName = null;
public static String selectedPaymentMethod = null;
public static List<String> itemNames = new ArrayList<>();
public static List<Double> itemDiscounts = new ArrayList<>();
public static List<String> prices = new ArrayList<>();
public static List<String> quantities = new ArrayList<>();
public static List<String> subTotals = new ArrayList<>();
public static ObservableList<Item> itemList;
public static List<String> columnItemData = new ArrayList<>();
public static List<String> columnQuantityData = new ArrayList<>();

@FXML
private void initialize() throws SQLException, ClassNotFoundException, IOException {

ObservableList<Product> productsData = ProductDAO.searchGoodProducts(app.values.getProperty("STATUS_TYPE1"));
populateProducts(productsData);

 }

@FXML
private void populateProducts(ObservableList<Product> productData) throws ClassNotFoundException {
    productTableView.setItems(productData);
}

@Override
public void keyTyped(java.awt.event.KeyEvent e) {

}

@Override
public void keyPressed(java.awt.event.KeyEvent e) {

    if (e.getKeyCode() == java.awt.event.KeyEvent.VK_F1) {

        try {
            paymentAction();
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }

}

@Override
public void keyReleased(java.awt.event.KeyEvent e) {

}

@FXML
public void paymentAction() throws Exception {

    if (validateInputsForPayment()) {
        Payment payment = new Payment();
        FXMLLoader loader = new FXMLLoader((getClass().getResource(app.values.getProperty("INVOICE_VIEW_LOCATION"))));
        Parent root = loader.load();
        Stage stage = new Stage();
        root.setOnMousePressed((MouseEvent e) -> {
            xOffset = e.getSceneX();
            yOffset = e.getSceneY();
        });
        root.setOnMouseDragged((MouseEvent e) -> {
            stage.setX(e.getScreenX() - xOffset);
            stage.setY(e.getScreenY() - yOffset);
        });
        Scene scene = new Scene(root);
        stage.initModality(Modality.APPLICATION_MODAL);
        stage.initStyle(StageStyle.UNDECORATED);
        stage.setScene(scene);
        this.paymentScene = scene;
        stage.showAndWait();
    }
}
公共类POSController实现KeyListener{
@FXML
私有TableView产品TableView;
@FXML
私有表视图列表表视图;
@FXML
私有菜单项logoutItem,配置文件;
@FXML
私有javafx.scene.image.ImageView backImage;
@FXML
私有菜单按钮菜单按钮;
@FXML
私有表列itemColumn;
@FXML
私有组合框clientId,paymentMethod;
@FXML
private TableColumn priceColumn、totalColumn、折扣百分比Column、金额Column;
@FXML
私有表列quantityColumn;
@FXML
私有表列productColumn;
@FXML
私有文本字段搜索字段、折扣百分比、产品字段、价格字段、数量字段、增值税百分比、小计字段、折扣字段、总增值税字段、增值税字段、净支付字段、总折扣字段;
@FXML
私有文本字段;
@FXML
私有文本字段;
@FXML
私有文本字段;
@FXML
私有文本字段;
@FXML
私有文本区域描述区域;
@FXML
私人按钮addButton、removeButton、paymentButton、resetTableButton、resetButton;
@FXML
专用标签quantityLabel、errorLabel、用户名、backLabel;
@FXML
私有可观察列表项目列表;
公共静态场景;
专用双xOffset=0;
专用双yOffset=0;
公共静态双金融可支付价格=0.0;
公共静态双最终SubTotalPrice=0.0;
公共静态双最终值=0.0;
公共静态双结局=0.0;
公共静态字符串clientName=null;
公共静态字符串selectedPaymentMethod=null;
public static List itemNames=new ArrayList();
公共静态列表项折扣=新的ArrayList();
公共静态标价=新ArrayList();
公共静态列表数量=新建ArrayList();
公共静态列表小计=新的ArrayList();
公共静态可观察列表项列表;
公共静态列表columnItemData=new ArrayList();
公共静态列表columnQuantityData=new ArrayList();
@FXML
private void initialize()引发SQLException、ClassNotFoundException、IOException{
ObservableList productsData=ProductDAO.searchGoodProducts(app.values.getProperty(“STATUS_TYPE1”);
大众产品(productsData);
}
@FXML
私有void populateProducts(ObservableList productData)引发ClassNotFoundException{
productTableView.setItems(productData);
}
@凌驾
public void keyTyped(java.awt.event.KeyEvent e){
}
@凌驾
按下public void键(java.awt.event.KeyEvent e){
if(e.getKeyCode()==java.awt.event.KeyEvent.VK_F1){
试一试{
paymentAction();
}捕获(异常e1){
e1.printStackTrace();
}
}
}
@凌驾
public void keyereleased(java.awt.event.KeyEvent e){
}
@FXML
public void paymentAction()引发异常{
if(validateInputsForPayment()){
付款=新付款();
FXMLLoader=newFXMLLoader((getClass().getResource(app.values.getProperty(“发票\视图\位置”)));
父根=loader.load();
阶段=新阶段();
root.setOnMousePressed((MouseEvent e)->{
xOffset=e.getSceneX();
yOffset=e.getSceneY();
});
root.setonmousedrable((MouseEvent e)->{
stage.setX(e.getScreenX()-xOffset);
stage.setY(例如getScreenY()-yOffset);
});
场景=新场景(根);
阶段.初始模态(模态.应用\模态);
舞台风格(舞台风格。未装饰);
舞台场景;
this.paymentScene=场景;
stage.show和wait();
}
}

您不应该对JavaFX应用程序使用
java.awt.event.keylister
。JavaFX有自己的一套事件API

假设
POSController
是特定FXML的控制器类:

public class POSController {
    @FXML private BorderPane root; // Or any other Node from FXML file

    @FXML private void initialize() {
        javafx.event.EventHandler<javafx.scene.input.KeyEvent> handler = event -> {
            if (event.getCode() == javafx.scene.input.KeyCode.F1) {
                try {
                    paymentAction();
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            }
        };

        // I'm using root to get scene, but any node would be fine
        if (root.getScene() != null) {
            root.getScene().addEventHandler(javafx.scene.input.KeyEvent.KEY_PRESSED, handler);
        }
        else {
            root.sceneProperty().addListener((obs, oldScene, newScene) -> {
                if (newScene != null) {
                    root.getScene().addEventHandler(javafx.scene.input.KeyEvent.KEY_PRESSED, handler);
                }
            });
        }
    }
}
公共类POSController{
@FXML private BorderPane root;//或FXML文件中的任何其他节点
@FXML私有void initialize(){
javafx.event.EventHandler=事件->{
if(event.getCode()==javafx.scene.input.KeyCode.F1){
试一试{
paymentAction();
}捕获(异常e1){
e1.printStackTrace();
}
}
};
//我使用root获取场景,但任何节点都可以
if(root.getScene()!=null){
root.getScene().addEventHandler(javafx.scene.input.KeyEvent.KEY_按下,处理程序);
}
否则{
root.sceneProperty().addListener((obs、旧场景、新场景)->{
if(newScene!=null){
root.getScene().addEventHandler(javafx.scene.input.KeyEvent.KEY_按下,处理程序);
}
});
}
}
}
这将把关键事件添加到
场景
。如果不需要在整个场景中应用此事件,则可以在其他适当的节点上添加事件处理程序

更新
如果场景中有任何输入控件,则可能需要使用
setEventFilter()
而不是
setEventHandler()
。这是因为这些控件可能会在事件冒泡阶段使用键事件。

您是否尝试使用java.awt.event.KeyEvent.VK_F1而不是com.sun.glass.events.KeyEvent.VK_F1?是的。方法“keyPressed”首先没有被调用。你能为这个问题提供一个最小的可执行示例吗?为什么要使用
java.awt.event.KeyListener
?你的应用程序是JavaFX,所以你应该使用JavaFX键事件。@Jai你能指定我如何在这个控制器类中执行此操作吗?@johnde921 Change
addEventHandler()
进入
添加过滤