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.

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.

Answers


The first issue (which I assume is NullPointerException) is due to the fact that you are shadowing your variables...

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

Updated

Now, if you want to respond to key events, the best approach is to use the Key Bindings API, for example

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...


Need Your Help

What can be the best Practice for a Rapid Web Application Development?

php javascript jquery html ajax

I am coming up with a web application which will be primarily based on PHP. I would like to know some of the best practices and technologies that I can make use of to come out with the app as fast as

increase a variable value for +1

c# winforms combobox selectedindex

From the code below I am getting a cell value from the selected row to a dataGridView:

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.