【问题标题】:Need to have keyListener listening regardless of what focus is on Java需要让 keyListener 监听,不管 Java 的重点是什么
【发布时间】:2011-04-04 22:21:11
【问题描述】:

我正在尝试制作一个刽子手游戏。我坚持尝试听击键。我希望用户能够按下一个键,它会测试它是否正确。我不想将它输入到文本框中,无论焦点如何,我都希望对该键进行测试。我尝试在面板中添加一个 keylistener,但它不起作用。整个东西由这个面板、一个左面板、一个主面板和一个主框架组成。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class RightPanel extends JPanel
{
JLabel jlbMissed, jlbWord, jlbScore, jlbTimer;
JComboBox jcbDifficulty;
JButton jbtStart, jbtQuit;
String[] difficulties = {"Easy", "Medium", "Hard"};
String[] words = {"First", "Next", "Hello", "World"};
char incorrectChar, correctChar;
String word;
int currentScore;
boolean clockIsRunning = false;
boolean gameInPlay = false;
int sec = 0;
int min = 0;




public RightPanel()
{

    this.setLayout(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();
    ActionHandler actionHandler = new ActionHandler();
    jlbMissed   = new JLabel("Missed: " + incorrectChar);
    jlbWord     = new JLabel("Word: " + correctChar);
    jlbScore    = new JLabel("Score: " + currentScore);
    jlbTimer    = new JLabel("Time: " + "0:00");
    jbtStart    = new JButton("Start");
    jbtQuit     = new JButton("Quit");
    jcbDifficulty = new JComboBox();
    for (int i = 0; i < 3; i++)
    {
        jcbDifficulty.addItem(difficulties[i]); // Creates Difficutly ComboBox
    }
    this.add(jcbDifficulty, getConstraints(0,0,1,1, GridBagConstraints.NORTH));
    this.add(jlbMissed, getConstraints(0,1,1,1, GridBagConstraints.CENTER));
    this.add(jlbWord, getConstraints(0,2,1,1, GridBagConstraints.CENTER));
    this.add(jlbScore, getConstraints(0,3,1,1, GridBagConstraints.CENTER));
    this.add(jlbTimer, getConstraints(0,4,1,1, GridBagConstraints.CENTER));
    this.add(jbtStart, getConstraints(0,6,1,1, GridBagConstraints.CENTER));
    this.add(jbtQuit, getConstraints(1,6,1,1, GridBagConstraints.CENTER));
    jbtStart.addActionListener(actionHandler);
    jbtQuit.addActionListener(actionHandler);
    Random ran = new Random();  //
    int rand = ran.nextInt(4);  // Generates random number then selects word from words array
    word = words[rand];         //
    KeyListener k = new KeyAdapter()
    {
         public void keyPressed(KeyEvent e) {System.out.println("key was pressed");}
    };
    this.addKeyListener(k);




}




private GridBagConstraints getConstraints(int gridx, int gridy, int gridwidth, int gridheight, int anchor)
{
    GridBagConstraints c = new GridBagConstraints();
    c.insets = new Insets(5,5,5,5);
    c.ipadx = 0;
    c.ipady = 0;
    c.gridx = gridx;
    c.gridy = gridy;
    c.gridwidth = gridwidth;
    c.gridheight = gridheight;
    c.anchor = anchor;
    return c;
}

class ActionHandler implements ActionListener
  {
public void actionPerformed(ActionEvent e)
{
    Object source = e.getSource();
    if (source == jbtStart)
    {
        clockIsRunning = true;
        MyTimer timer = new MyTimer();
        timer.start();
        gameInPlay = true;
    }
    else if (source == jbtQuit)
    {
        System.exit(0);
        }

}
  }
  class MyTimer extends Thread
  {
public void run()
{
    while(true)
    {
        if(!clockIsRunning)
            break;
        try
        {
            Thread.sleep(1000);
        }
        catch (InterruptedException ecp)
        {
        }

        if (sec == 59)
        {
            min++;
            sec = 0;
        }
        else
            sec++;
        if(sec < 10)
            jlbTimer.setText("Time:" + min+":0"+sec);
        else
            jlbTimer.setText("Time:" + min+":"+sec);
    }
}
  }

【问题讨论】:

标签: java keylistener jcreator


【解决方案1】:

如果我对您的理解正确,您希望此关键侦听器始终在任何地方工作。如果是这种情况,您可以将自己的框架设为 KeyListener,如 the Swing tutorial 中的 this demo 中所述。

我知道它看起来需要一个文本框,但请尝试将其添加为第 118 行:

displayArea.addKeyListener(this);

【讨论】:

  • 我创建了显示区域'JTextArea displayArea;'现在对我来说,第 118 行显示在计时器方法的中间。我把它放在 RightPanel() 的底部,它出现了消息 addKeyListener(java.awt.event.KeyListener) in java.awt.Component cannot be applied to (RightPanel)
  • @Marcus,不,不是 your 第 118 行。我不知道你程序中的行号是什么;你甚至没有全部发布。如果您在我链接的演示中将其添加为第 118 行,即使输出区域具有焦点,它也可以工作。
  • 它只起作用,因为 displayArea.addKeyListener 监听它。如果焦点在按钮上,则它不起作用。现在我只是将 KeyListeners 添加到组合框和按钮中,因为它们几乎是唯一可以成为焦点的东西。
猜你喜欢
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 2015-10-16
  • 2010-11-08
  • 1970-01-01
  • 2012-03-22
相关资源
最近更新 更多