关于 线程 Swing的一点小问题

kong_resty 发布于 2012/03/19 11:44
阅读 188
收藏 0

问题描述:

        我想做的是:

                当我点击下按钮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();
  }
 }
}

加载中
0
Monkey
Monkey
actionPerformed里加一句   requestFocusInWindow();没拿到焦点的控件是无法抓消息的。还有一点往JFrame上加加东西,getContentPane().add(panel)这么加,JDK里著名的,不然容易出现莫名其妙的问题。
Jeky
Jeky
@Monkey : JFrame的add就是getContentPane().add(),看看JFrame里的addImpl是怎么写的就行了,不过你要是习惯了我没意见
Monkey
Monkey
@Jeky : swing重量级控件都是交给JRootPane来实现的,为了安全起见还是多敲几个字母为好,比如改变布局,改变背景色什么的,否则万一哪天出错头想破了都不会想到错在这里了。
Jeky
Jeky
这个在JFrame里是没问题的,add默认就直接添加到contentPane里,除非你修改了rootPaneCheckingEnabled
0
黄龍
黄龍

第一你点击jb后要改变direction的值为"HELLO" 循环中要输出(direction)而非("haha")

第二你按下键盘上下左右后要改变direction的值为"wocao"

这两步你都没有做,而且代码写得不好!建议你重写一下~

0
Jeky
Jeky

跟线程没关系

键盘事件传递给的控件是当前焦点所在的控件,你给Frame加上KeyListener,那么只有当焦点是Frame的时候才会输出wocao

你可以在你的actionPerformed里的最后一行加上this.requestFocus(),让焦点回到Frame上,这样就行了

返回顶部
顶部