刚问了一次,基本明白了些,自己改了下,现在还有个问题不明白...
在文本框里 点10次 Enter 后 F1 会失效.....别的情况下都可以,就不明白这种怎么回事,想的头都炸了,估计还是和焦点有关系...
package guess;import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Random;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;public class Guess extends JFrame {
private int guess;
private Container cn;
private int n; // 机会次数 private boolean gameOver; private JTextField tx = new JTextField(5); private JButton jb = new JButton("猜测"); private JLabel title = new JLabel("范围为0-500");
private JLabel life = new JLabel("还有10次机会"); private JLabel judge = new JLabel("------------------------"); private JPanel panel1 = new JPanel();
private JPanel panel2 = new JPanel();
private JPanel panel3 = new JPanel();
private JPanel panel4 = new JPanel(); public Guess() { n = 10;
cn = this.getContentPane();
guess = new Random().nextInt(500); // 定制随即的范围 cn.add(panel1);
panel1.add(title);
panel1.add(life); cn.add(panel2);
panel2.add(new JLabel("输入猜测的数"));
panel2.add(tx); cn.add(panel3);
panel3.add(judge); cn.add(panel4);
panel4.add(jb); this.setLayout(new GridLayout(4, 1));
this.setVisible(true);
this.setSize(200, 180);
this.setLocation(300, 300);
//this.setFocusable(true); jb.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
int i = Integer.valueOf(tx.getText());
if (!gameOver) {
if (i == guess) {
judge.setText("恭喜你 猜对了");
title.setText("点击F1 重新开始");
gameOver=true;
tx.setEnabled(false);
jb.setEnabled(false);
} else if (i < guess) {
judge.setText("很遗憾 猜小了");
n--;
} else {
judge.setText("很遗憾 猜大了");
n--;
}
if(n==0)   //没机会了
{
judge.setText("你太脑残了,GAMEOVER");
title.setText("点击F1 重新开始");
gameOver=true;
tx.setEnabled(false);
jb.setEnabled(false);
}
life.setText("还有" + n + "次机会");
}
}
});
this.addKeyListener(new key());
tx.addKeyListener(new key());
jb.addKeyListener(new key());
} private class key extends KeyAdapter { @Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
switch (key) {
case KeyEvent.VK_F1:
if (gameOver) {
guess = new Random().nextInt(1000);
jb.setEnabled(true);
tx.setEnabled(true);
n=10;
gameOver=false;
title.setText("范围为0-500,开始");
life.setText("还有" + n + "次机会");
judge.setText("------------------------");
}
break;
case KeyEvent.VK_ENTER:
if (!gameOver) {
int i = Integer.valueOf(tx.getText());
if (i == guess) {
judge.setText("恭喜你 猜对了");
title.setText("点击F1 重新开始");
gameOver=true;
tx.setEnabled(false);
jb.setEnabled(false);
} else if (i < guess) {
judge.setText("很遗憾 猜小了");
n--;
} else {
judge.setText("很遗憾 猜大了");
n--;
}
if(n==0)   //没机会了
{
judge.setText("你太脑残了,GAMEOVER");
title.setText("点击F1 重新开始");
gameOver=true;
tx.setEnabled(false);
jb.setEnabled(false);
}
life.setText("还有" + n + "次机会");
break;
}
}
} } public static void main(String[] args) {
new Guess();
}
}

解决方案 »

  1.   

    把  //this.setFocusable(true);  不屏蔽...还有一种情况 就1楼开始说的那种 实现不了
     
      

  2.   

    tx在panel2上,当tx被隐藏时,即setVisible(false)后,焦点会设置在panel2上,而panel2没有加入key监听器,所以监听不了事件,同理bt和panel3也是这样
    另外,对输入没做判断,int i = Integer.valueOf(tx.getText());//如果输入的是非数字,会抛出异常
      

  3.   

    可以 我就算  panel1.addKeyListener(new key());
    panel2.addKeyListener(new key());
    panel3.addKeyListener(new key());
    panel4.addKeyListener(new key());了,还是不行啊.....楼上的哥哥能改好 发个完整的吗```
      

  4.   

    tx.setEnabled(false); 都不能用了焦点怎么可以设置上去?
      

  5.   

    懒得写了,在你的基础上改了下,你试试看public class Guess extends JFrame {
        static final int MAX_NUM = 500;
        private int guess;
        private Container cn;
        private int n; // 机会次数    private boolean gameOver = false;    private JTextField tx = new JTextField(5);    private JButton jb = new JButton("猜测");    private JLabel title = new JLabel("范围为0-500");
        private JLabel life = new JLabel("还有10次机会");    private JLabel judge = new JLabel("------------------------");    private JPanel panel1 = new JPanel();
        private JPanel panel2 = new JPanel();
        private JPanel panel3 = new JPanel();
        private JPanel panel4 = new JPanel();
        public Guess() {        n = 10;
            cn = this.getContentPane();
            guess = new Random().nextInt(MAX_NUM); // 定制随即的范围         cn.add(panel1);
            panel1.add(title);
            panel1.add(life);        cn.add(panel2);
            panel2.add(new JLabel("输入猜测的数"));
            panel2.add(tx);        cn.add(panel3);
            panel3.add(judge);        cn.add(panel4);
            panel4.add(jb);        this.setLayout(new GridLayout(4, 1));
            this.setVisible(true);
            this.setSize(200, 180);
            this.setLocation(300, 300);
            //this.setFocusable(true);        jb.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    // TODO Auto-generated method stub
                    if (!gameOver) {
                        checkGuess();
                    }
            });
            //this.addKeyListener(new key());
            //tx.addKeyListener(new key());
            //jb.addKeyListener(new key());
            setKeyListener(this, new key());
            //resetGame();
        }    private class key extends KeyAdapter {        @Override
            public void keyPressed(KeyEvent e) {
                int key = e.getKeyCode();
                switch (key) {
                case KeyEvent.VK_F1:
                    if (gameOver) {
                        resetGame();
                    }
                    break;
                case KeyEvent.VK_ENTER:
                    if (!gameOver) {
                        checkGuess();
                    }
                    break;
                }
            }
        }    private void resetGame() {
            guess = new Random().nextInt(MAX_NUM);
            jb.setEnabled(true);
            tx.setEnabled(true);
            n=10;
            gameOver=false;
            title.setText("范围为0-500,开始");
            life.setText("还有" + n + "次机会");
            judge.setText("------------------------");
            tx.requestFocus();
        }    private void checkGuess() {
            int i = 0;
            try {
                int i = Integer.valueOf(tx.getText()).intValue();
            } catch (Throwable e) {
                judge.setText("请输入500以内的数字!");
                return;
            }
            if (i == guess) {
                judge.setText("恭喜你 猜对了");
                title.setText("点击F1 重新开始");
                gameOver=true;
                tx.setEnabled(false);
                jb.setEnabled(false);
            } else if (i < guess) {
                judge.setText("很遗憾 猜小了");
                n--;
            } else {
                judge.setText("很遗憾 猜大了");
                n--;
            }
            if(n==0) {
                judge.setText("你太脑残了,GAMEOVER");
                title.setText("点击F1 重新开始");
                gameOver=true;
                tx.setEnabled(false);
                jb.setEnabled(false);
                this.requestFocus(); //have a try
            }
            life.setText("还有" + n + "次机会");
        }    private void setKeyListener(Container c, KeyAdapter ka) {
            for (Component comp : c.getComponents()) {
                comp.addKeyListener(ka);
                if (comp instanceof Container) {
                    setKeyListener((Container)comp, ka);
                }
            }
        }
    }