【问题标题】:How to make EvenHandler work properly in JavaFX?如何使 EvenHandler 在 JavaFX 中正常工作?
【发布时间】:2020-09-28 15:32:17
【问题描述】:

我重新安排了我的问题,这样会更容易。

此代码应生成窗口,我需要按键盘时的控制台输出。 出现窗口,但我的 EventHandlers 不起作用。

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Main  {

    public static void main(String[] args) {
        JFrame frame = new JFrame("JavaFX in Swing");
        frame.setLayout(new BorderLayout());

        Charts charts = new Charts();

        frame.setSize(1024, 720); //Size of dispalayed window
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static class Charts extends JPanel implements KeyListener{

        public Charts(){
            addKeyListener(this);
        }

        @Override
        public void keyTyped(java.awt.event.KeyEvent key) {
            if(key.getKeyCode() == KeyEvent.VK_DOWN){
                System.out.println("DOWN");
            }
        }

        @Override
        public void keyPressed(java.awt.event.KeyEvent key) {
            if(key.getKeyCode() == KeyEvent.VK_DOWN){
                System.out.println("DOWN");
            }
        }

        @Override
        public void keyReleased(java.awt.event.KeyEvent key) {
            if(key.getKeyCode() == KeyEvent.VK_DOWN){
                System.out.println("DOWN");
            }
        }
    }
}

我做错了什么,这个 EventHandler 不起作用?

【问题讨论】:

  • 完成有关事件处理的教程,将其应用到您的场景中,当卡住时返回 minimal reproducible example 以展示未按预期工作的内容。哦……不需要“喊”你认为重要的词:我们完全有能力掌握重要的东西:)
  • 我编辑了我的问题。我希望现在好多了。我会很感激任何帮助
  • 1.你实际上并没有用任何东西注册你的事件处理程序:即你需要做一些类似something.setOnKeyPressed(keyEventHandler);的事情。 2. 键事件仅在它们注册的节点(或子节点)具有键盘焦点时才会触发,这对于JFXPanel 或任何图表来说似乎都不太可能。使用封闭的JFrame 注册 AWT 事件处理程序可能会更好。如果您想要完整的答案,您可能需要创建一个minimal reproducible example
  • 它必须是可重现的——就像 c&p-a-single-class-into-my-IDE-and-run 一样(你不希望我围绕你的问题编写你的样板代码,是吗 ;) 并且不要忘记导入,虽然它们通常很清楚,但它们可能会在组合 Swing/fx 应用程序中混淆
  • 如果我没记错的话,你正在使用 swing。代码中似乎没有使用任何与 JavaFX 相关的内容(或文中提到的);重新标记问题。

标签: java swing graph keylistener eventhandler


【解决方案1】:
public static void main(String[] args) {
    // there's no JavaFX in this example
    JFrame frame = new JFrame("JavaFX in Swing");
    frame.setLayout(new BorderLayout());

    Charts charts = new Charts();

    // add charts panel to frame to allow swing manage it in event processing
    frame.setContentPane(charts);

    frame.setSize(1024, 720); //Size of dispalayed window
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static class Charts extends JPanel {

    public Charts(){
        // Keylistener wont't work if there is no focused component (ie JTextField)
        // JPanel is not focusable component
        // So use registerKeyboardAction to handle events
        registerKeyboardAction(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("DOWN press");
            }
        }, KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), WHEN_IN_FOCUSED_WINDOW);

        registerKeyboardAction(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("DOWN release");
            }
        }, KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, true), WHEN_IN_FOCUSED_WINDOW);
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-07
    • 2013-12-21
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多