如何使用KeyListener显示不同的字符串,具体取决于按下哪个键?

时间:2013-12-09 01:08:22

标签: java swing user-interface jframe keylistener

对我来说很容易,我对Java编程一般都很陌生,尤其是swing,我正在努力学习GUI编程的基础知识。

我希望能够提示用户在文本框中输入某个键,然后单击按钮以根据输入的键显示一串文本。这就是我到目前为止所做的:

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!");
        }
    }
}

我意识到ActionListener不是正确使用的事件,我只是不确定该放在那里(我猜测KeyListener。)所有意见/建议都非常感谢。

1 个答案:

答案 0 :(得分:1)

第一个问题(我假设是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();
            //...
        }
    }
}

所以不要使用......

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

你应该使用......

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

这样可以防止您NullPointerException方法

中出现actionPerformed

<强>更新

现在,如果您想要响应关键事件,最好的方法是使用Key Bindings 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);
            }

        }


    }

}

根据您的需要,它可以更好地控制焦点要求......