-3

我需要一些关于我的 java 代码的帮助我是 java 的新手,我想要做的是一旦我按下一个字母我想显示一些消息只是为了验证代码是否有效。使用 javax swing 库特别是 keylistener 和 key event,我不知道我是否做得对。这是我的代码:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
public class KeyStrokeButton{
    public JFrame frame;
    public JPanel panel;
    public JButton btnfocus, btnrelease, btnwindow, btnancestor;
    public JTextField text;
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable(){
            public void run()
            {
                KeyStrokeButton mydesign = new KeyStrokeButton();
                mydesign.design();
            }
        });
    }

    public void design()
    {


        panel = new JPanel();
        panel.setLayout(null);

        frame = new JFrame("Keystroke Tutorials");
        frame.getContentPane().add(panel);
        frame.setSize(250, 250);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        btnfocus = new JButton("<html><center>Focus");
        btnfocus.setBounds(10, 10, 90, 80);
        panel.add(btnfocus);
        btnfocus.addKeyListener(new ClickPressed());


        btnrelease = new JButton("Release");
        btnrelease.setBounds(110, 10, 90, 80);
        panel.add(btnrelease);


        btnancestor = new JButton("Ancestor");
        btnancestor.setBounds(10, 100, 90, 80);
        panel.add(btnancestor);


        btnwindow = new JButton("Window");
        btnwindow.setBounds(110, 100, 90, 80);
        panel.add(btnwindow);
    }
    class ClickPressed implements KeyListener
    {
        public void KeyPressed(KeyEvent e)
        {
            //any code.
        }
    }
}

我想尽可能地为事件分离我的代码,所以我创建了一个类以使其可读。

4

4 回答 4

6

KeyListener在这方面是基于当前的重点。也就是说,关键事件只会传递给当前具有焦点的组件。

因此,例如,您有 3 个按钮。焦点按钮只有在获得焦点时才会收到按键事件。如果任何其他组件具有焦点,则焦点按钮将不会接收键事件。

一般来说,KeyListeners 不是一个好主意。使用Key Bindings API会更好

更好地解释您要实现的目标将进一步帮助我们。

于 2012-08-14T00:48:56.957 回答
4

Sujay 的回答将为您提供所需的所有信息,但这里有一个监听关键事件的快速示例。

你可以在启动后添加一个全局键监听器到你的 JFrame:

KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
manager.addKeyEventDispatcher (new MyDispatcher());

然后,您需要创建一个关键事件调度程序,并将您的代码添加到其中

   private class MyDispatcher implements KeyEventDispatcher
    {
        @Override
        public boolean dispatchKeyEvent(KeyEvent e)
        {
            if (e.getKeyCode() == 38) //up key
            {
            //Do something when the up key is pressed
            System.out.println("The up key was pressed");
            }
            else if (e.getKeyCode() == 40) //down key
            {
                //Do something when the down key is pressed
                System.out.println("The down key was pressed");
            }
            return false;
        }
    }
于 2012-08-14T00:57:44.570 回答
4

我不知道您发布的内容中是否存在真正的问题。但是从您的代码来看,这里有几个指针:

我希望这会帮助你开始。

于 2012-08-14T00:47:27.533 回答
0

尝试使用以下代码在 JFrame 中构建 KeyListener:设置代码以便在按下时检测到 enter 和 escape 键。

import java.awt.event.KeyEvent;
import java.awt.event.ActionEvent;
import java.awt.event.KeyListener;

class KeyListener extends JFrame implements KeyListener {

@Override
public void keyReleased(KeyEvent e) {               // Required for      KeyListener override

}
@Override
public void keyTyped(KeyEvent e) {                  // Required for     KeyListener override

}
}
public KeyListener() {

addKeyListener(this);        // KeyListener added to JFrame to detect key strokes
setFocusable(true);          // Ensure JFrame can gain focus

}

public void keyPressed(KeyEvent e) {    // Code to handle when key pressed
int keyCode = e.getKeyCode();
switch( keyCode ) { 
case KeyEvent.VK_ENTER:          // Code to handle when enter key pressed

    // ENTER CODE HERE

    break;
case KeyEvent.VK_ESCAPE:        // Code to handle when Escape key pressed
    // ENTER CODE HERE
    break;

} }

于 2015-07-26T16:37:48.937 回答