开发者

Need to have keyListener listening regardless of what focus is on Java

开发者 https://www.devze.com 2023-02-21 20:34 出处:网络
Im trying to make a hangman game. Im stuck on trying to listen for the keystroke. I want the user to be able to press a key and it will test to see if it is correct or not. I dont want to have to have

Im trying to make a hangman game. Im stuck on trying to listen for the keystroke. I want the user to be able to press a key and it will test to see if it is correct or not. I dont want to have to have it inputted into a text box, regardless of focus I want that key to be tested against the word. Ive tried adding a keylistener to the panel and it doesnt work. The whole thing consists of this panel, a leftpanel, a main panel and then a main frame.

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 exte开发者_开发百科nds 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);
    }
}
  }


If I understand you correctly, you want this key listener to work everywhere, all the time. If that's the case, you can just make your frame its own KeyListener, as described in this demo from the Swing tutorial.

I know it looks like it requires a text box, but try adding this as line 118:

displayArea.addKeyListener(this);
0

精彩评论

暂无评论...
验证码 换一张
取 消