簡體   English   中英

如何使用KeyListener根據所按下的鍵顯示不同的字符串?

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

放輕松吧,我一般來說對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。)所有評論/建議都受到高度贊賞。

第一個問題(我假設是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方法中發生

更新

現在,如果您想響應按鍵事件,最好的方法是使用按鍵綁定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);
            }

        }


    }

}

根據您的需求,它可以更好地控制焦點要求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM