关于 线程 Swing的一点小问题? 400 报错
问题描述:
我想做的是:
当我点击下按钮1 我就促发一个线程,每隔一秒打印个 hello
在打印hello的期间 我也想要有键盘促发事件 我点击键盘向上、下、右、左会打印出
wocao
但是我以下代码的执行结果却是:
我不点击按钮1 我点击键盘向上、下、右、左会打印出wocao
但是点击按钮之后 点击键盘向上、下、右、左再也不起作用了, 我知道我一定是在线程控制上出问题了,但是怎么也找不出原因,哪位能解释下?
java code
package Ztest2;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Demo2 extends JFrame implements KeyListener,ActionListener{
private String direction;
private JButton jb = new JButton("按钮1");
public Demo2(String direction){
this.direction = direction;
this.setLayout(new BorderLayout());
this.setSize(400,200);
jb.addActionListener(this);
this.add(jb,BorderLayout.NORTH);
this.setVisible(true);
this.addKeyListener(this);
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
int k = e.getKeyCode();
System.out.println(k);
if(k==KeyEvent.VK_RIGHT){
System.out.println(direction);
}else if(k==KeyEvent.VK_LEFT){
System.out.println(direction);
}else if(k==KeyEvent.VK_DOWN){
System.out.println(direction);
}else if(k==KeyEvent.VK_UP){
System.out.println(direction);
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
public static void main(String[] args) {
Demo2 d2 = new Demo2("wocao");
}
@Override
public void actionPerformed(ActionEvent e) {
Object o1 =e.getSource();
System.out.println(o1);
if(o1==jb){
Thread t = new Thread(){
public void run(){
while(true){
System.out.println("haha");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
t.start();
}
}
}
actionPerformed里加一句 requestFocusInWindow();没拿到焦点的控件是无法抓消息的。还有一点往JFrame上加加东西,getContentPane().add(panel)这么加,JDK里著名的,不然容易出现莫名其妙的问题。######@Monkey : JFrame的add就是getContentPane().add(),看看JFrame里的addImpl是怎么写的就行了,不过你要是习惯了我没意见######@Jeky : swing重量级控件都是交给JRootPane来实现的,为了安全起见还是多敲几个字母为好,比如改变布局,改变背景色什么的,否则万一哪天出错头想破了都不会想到错在这里了。######这个在JFrame里是没问题的,add默认就直接添加到contentPane里,除非你修改了rootPaneCheckingEnabled######
第一你点击jb后要改变direction的值为"HELLO" 循环中要输出(direction)而非("haha")
第二你按下键盘上下左右后要改变direction的值为"wocao"
这两步你都没有做,而且代码写得不好!建议你重写一下~
######跟线程没关系
键盘事件传递给的控件是当前焦点所在的控件,你给Frame加上KeyListener,那么只有当焦点是Frame的时候才会输出wocao
你可以在你的actionPerformed里的最后一行加上this.requestFocus(),让焦点回到Frame上,这样就行了
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。