简体   繁体   English

如何使用KeyListener根据所按下的键显示不同的字符串?

[英]How Do I use KeyListener to Display Different Strings Depending on Which Key is Pressed?

Take it easy on me, I'm pretty new to Java programming in general, especially swing, and I'm trying to learn the basics of GUI programming. 放轻松吧,我一般来说对Java编程还是相当陌生的,尤其是swing,而且我正在尝试学习GUI编程的基础知识。

I want to be able to prompt the user to enter a certain key into a text box and then click a button to display a string of text based on what key they enter. 我希望能够提示用户在文本框中输入某个键,然后单击一个按钮以根据他们输入的键显示文本字符串。 This is what I have so far: 这是我到目前为止的内容:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class LeeSinAbilities extends JFrame
{
    private JLabel leeSin;
    private JTextField ability;
    private JButton c;
    private JLabel aName;
    private static final long serialVersionUID = 1L;
    public LeeSinAbilities()
    {
       super("Lee Sin's Abilities");
       setLayout(new FlowLayout());
       setResizable(true);
       setSize(500, 500);
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

       JLabel leeSin = new JLabel("Enter an ability key to see Lee Sin's ability names! (q, w, e, r)");
       add(leeSin);

       JTextField ability = new JTextField("Enter abilities here: ", 1);
       add(ability);

       JButton go = new JButton("Get Ability Name");
       add(go);

       JLabel aName = new JLabel("");
       add(aName);

       event e = new event();
       go.addActionListener(e);
    }
    public static void main(String [] args){
       new LeeSinAbilities().setVisible(true);
    }
    public class event implements ActionListener{
        public void actionPerformed(ActionEvent e){
            String abilityName = ability.getText();
               if(abilityName.equalsIgnoreCase("q")){
                   aName.setText("Sonic Wave / Resonating Strike");
                }
               else if(abilityName.equalsIgnoreCase("w")){
                   aName.setText("Safeguard / Iron Will");
                }
                else if(abilityName.equalsIgnoreCase("e")){
                   aName.setText("Tempest / Cripple");
                }
                else if(abilityName.equalsIgnoreCase("r")){
                   aName.setText("Dragon's Rage");
                }
                else
                   aName.setText("Brutha please -_-...q, w, e, or r!");
        }
    }
}

I realise ActionListener is not the correct event to use, I'm just not sure what to put there yet (I'm guessing KeyListener.) All comments / suggestions are highly appreciated. 我意识到ActionListener不是要使用的正确事件,我只是不确定该放在哪里(我在猜测KeyListener。)所有评论/建议都受到高度赞赏。

The first issue (which I assume is NullPointerException ) is due to the fact that you are shadowing your variables... 第一个问题(我假设是NullPointerException )是由于您正在隐藏变量...

public class LeeSinAbilities extends JFrame
{
    //...
    // This is a instance variable named ability
    private JTextField ability;
    //...
    public LeeSinAbilities()
    {
       //...
       // This is a local variable named ability , which
       // is now shadowing the instance variable...
       JTextField ability = new JTextField("Enter abilities here: ", 1);
       //...
    }
    public class event implements ActionListener{
        public void actionPerformed(ActionEvent e){
            // This will be `null` as it's referencing the
            // instance variable...
            String abilityName = ability.getText();
            //...
        }
    }
}

So instead of using... 所以不要使用...

       JTextField ability = new JTextField("Enter abilities here: ", 1);

You should be using... 您应该使用...

       ability = new JTextField("Enter abilities here: ", 1);

This will prevent the NullPointerException from occurring in you actionPerformed method 这将防止NullPointerException在您的actionPerformed方法中发生

Updated 更新

Now, if you want to respond to key events, the best approach is to use the Key Bindings API, for example 现在,如果您想响应按键事件,最好的方法是使用按键绑定API,例如

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class KeyPrompt {

    public static void main(String[] args) {
        new KeyPrompt();
    }

    public KeyPrompt() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.setSize(400, 200);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JLabel aName;

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;

            add(new JLabel("Enter an ability key to see Lee Sin's ability names! (q, w, e, r)"), gbc);
            aName = new JLabel("");
            add(aName, gbc);

            InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
            ActionMap am = getActionMap();

            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_Q, 0), "QAbility");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0), "WAbility");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_E, 0), "EAbility");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_R, 0), "RAbility");

            am.put("QAbility", new MessageAction(aName, "Sonic Wave / Resonating Strike"));
            am.put("WAbility", new MessageAction(aName, "Safeguard / Iron Will"));
            am.put("EAbility", new MessageAction(aName, "Tempest / Cripple"));
            am.put("RAbility", new MessageAction(aName, "Dragon's Rage"));

        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.dispose();
        }

        public class MessageAction extends AbstractAction {

            private final String msg;
            private final JLabel msgLabel;

            public MessageAction(JLabel msgLabel, String msg) {
                this.msgLabel = msgLabel;
                this.msg = msg;
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                msgLabel.setText(msg);
            }

        }


    }

}

It has better control over the focus requirements depending on your needs... 根据您的需求,它可以更好地控制焦点要求。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM