JavaFX在按下指定键后运行一个方法
我试图在使用KeyListener按下指定键后,在指定给特定任务的控制器类中运行一个方法。但是我无法检测按键并调用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
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 ChangeaddEventHandler()
进入添加过滤