2011-08-05 6 views
0

한 손에는 복잡한 멀티 스레드 응용 프로그램이 있고 다른 응용 프로그램에는 첫 번째 스레드 응용 프로그램을 디버깅하는 데 사용할 단일 스레드 응용 프로그램이 있습니다. 을 종류로 사용하려고 시도했지만 아무리 노력해도 큰 응용 프로그램에서는 dispatchKeyEvent을 실행할 수 없지만 작은 응용 프로그램은 첫 번째 시도에서 작동했으며 모두 동일한 KeyEventDispatcher을 사용합니다. 수업. 나는 해결책, 또는 적어도 설명을 위해 인터넷을 채찍질했다. 그러나 나는 근본적으로 아무 것도 발견하지 못했다. 여기에 KeyEventDispatcher(AoDKeyboard) 클래스에 대한 코드의KeyEventDispatcher는 하나의 응용 프로그램에서 작동하지만 다른 응용 프로그램에서는 작동하지 않습니다.

import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.*; 
import javax.swing.*; 
import zistack.AoD.*; 

public class KeyEventDispatcherTest extends JFrame implements Runnable{ 

    static KeyEventDispatcherTest test; 
    BufferedImage buffer; 
    Graphics2D g2d; 
    AoDKeyboard ked; 
    boolean b = false; 

    public KeyEventDispatcherTest(){ 

     this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     buffer = new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB); 
     g2d = buffer.createGraphics(); 
     ked = new AoDKeyboard(); 
     KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(ked); 
     new Thread(this).start(); 

    } 

    public static void main(String[] args){ 

     test = new KeyEventDispatcherTest(); 

    } 

    public void run() { 

     g2d.setColor(Color.BLACK); 
     g2d.fillRect(0, 0, 500, 500); 
     this.repaint(); 
     this.setSize(500, 500); 
     this.setVisible(true); 

     while(true){ 

      this.repaint(); 
      try{ 
       Thread.sleep(20); 
      } 
      catch(InterruptedException e){ 
       e.printStackTrace(); 
      } 

     } 

    } 

    public void paint(Graphics g){ 

     g.drawImage(buffer, 0, 0, null); 
     g.setColor(Color.CYAN); 
     g.drawString("" + ked.test, 0, 0); 
     for(int i = 0; i < ked.keypressed.length; i++) g.drawString("" + ked.keypressed[i], 0 + ((i % 5) * 100), 15 + ((i/5) * 15)); 

    } 

} 

: 여기

은 작은 응용 프로그램에 대한 코드의

package zistack.AoD; 

import java.awt.*; 
import java.awt.event.*; 

public class AoDKeyboard implements KeyEventDispatcher{ 

     public final int[] keycode = {KeyEvent.VK_0, KeyEvent.VK_1, KeyEvent.VK_2, KeyEvent.VK_3, KeyEvent.VK_4, KeyEvent.VK_5, 
       KeyEvent.VK_6, KeyEvent.VK_7, KeyEvent.VK_8, KeyEvent.VK_9, KeyEvent.VK_A, KeyEvent.VK_B, KeyEvent.VK_C, 
       KeyEvent.VK_D, KeyEvent.VK_E, KeyEvent.VK_F, KeyEvent.VK_G, KeyEvent.VK_H, KeyEvent.VK_I, KeyEvent.VK_J, 
       KeyEvent.VK_K, KeyEvent.VK_L, KeyEvent.VK_M, KeyEvent.VK_N, KeyEvent.VK_O, KeyEvent.VK_P, KeyEvent.VK_Q, 
       KeyEvent.VK_R, KeyEvent.VK_S, KeyEvent.VK_T, KeyEvent.VK_U, KeyEvent.VK_V, KeyEvent.VK_W, KeyEvent.VK_X, 
       KeyEvent.VK_Y, KeyEvent.VK_Z, KeyEvent.VK_UP, KeyEvent.VK_DOWN, KeyEvent.VK_LEFT, KeyEvent.VK_RIGHT, 
       KeyEvent.VK_F1, KeyEvent.VK_F2, KeyEvent.VK_F3, KeyEvent.VK_F4, KeyEvent.VK_F5, KeyEvent.VK_F6, KeyEvent.VK_F7, 
       KeyEvent.VK_F8, KeyEvent.VK_F9, KeyEvent.VK_F10, KeyEvent.VK_F11, KeyEvent.VK_F12}; 
     public boolean[] keypressed = new boolean[keycode.length]; 

     public boolean test = false; 

    public AoDKeyboard(){ 

     for(int i = 0; i < keypressed.length; i++) keypressed[i] = false; 

    } 

    public boolean dispatchKeyEvent(KeyEvent e){ 

     if(e.getID() == e.KEY_PRESSED) for(int i = 0; i < keycode.length; i++) if(e.getKeyCode() == keycode[i]) keypressed[i] = true; 

     if(e.getID() == e.KEY_RELEASED) for(int i = 0; i < keycode.length; i++) if(e.getKeyCode() == keycode[i]) keypressed[i] = false; 

     test = true; 
     return false; 

    } 

} 

그리고 마지막으로, 여기에 KeyEventDispatcher이 들어있는 대형 응용 프로그램의 코드의 일부이다 그 작동하지 않음 :

package zistack.AoD; 

import zistack.*; 
import java.awt.*; 
import java.awt.event.KeyEvent; 
import java.awt.image.BufferedImage; 
import java.util.Vector; 

public class AoDGraphicUpdater implements Runnable{ 

    KeyboardFocusManager keymanager; 
    BufferedImage backbuffer; 
    Graphics2D g2d; 
    protected Vector gameobjects; 
    protected GameWindow gwindow; 
    protected Thread updater; 
    protected long timer = 0; 
    protected int fademode, fadealpha; 
    public final int DARK = 0, FADE_TO_CLEAR = 1, CLEAR = 2, FADE_TO_DARK = 3; 

    AoDKeyboard keyboard;//////////////create keydispatcher 

    public AoDGraphicUpdater(Vector v, GameWindow gw){ 

     keyboard = new AoDKeyboard();/////////// 
     keymanager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); 
     keymanager.addKeyEventDispatcher(keyboard);//////////add dispatcher to qeue 
     gameobjects = v; 
     gwindow = gw; 
     backbuffer = new BufferedImage(gwindow.getWidth(), gwindow.getHeight(), BufferedImage.TYPE_INT_RGB); 
     g2d = backbuffer.createGraphics(); 
     g2d.setComposite(AlphaComposite.SrcOver); 
     fademode = DARK; 
     fadealpha = 255; 
     updater = new Thread(this); 
     updater.start(); 

    } 

    public void run(){ 

     g2d.setFont(new Font("Dialog", Font.PLAIN, 10)); 
     while(true){ 
      wipeScreen(g2d); 
      g2d.setColor(Color.CYAN); 

      //UPDATE OBJECTS 

      ((GameView)gameobjects.firstElement()).update(); 
      ((AoDMenuHandler)gameobjects.elementAt(2)).update(); 

      //DRAW OBJECTS 

      if(fadeMode() != DARK){ 
       //draw anything under fade layer 
       ((AoDSpaceGenerator)gameobjects.elementAt(1)).graphicUpdate(g2d); 

      } 

      if(fadeMode() == FADE_TO_CLEAR){ 
       g2d.setColor(new Color(0, 0, 0, fadeAlpha())); 
       g2d.fillRect(0, 0, backbuffer.getWidth(), backbuffer.getHeight()); 
       setFadeAlpha(fadeAlpha() - 15); 
       if(fadeAlpha() <= 0)setFadeMode(CLEAR); 
      } 
      else if(fadeMode() == FADE_TO_DARK){ 
       g2d.setColor(new Color(0, 0, 0, fadeAlpha())); 
       g2d.fillRect(0, 0, backbuffer.getWidth(), backbuffer.getHeight()); 
       setFadeAlpha(fadeAlpha() + 15); 
       if(fadeAlpha() >= 255)setFadeMode(DARK); 
      } 

      //draw anything on top of the fade layer 
      ((AoDMenuHandler)gameobjects.elementAt(2)).graphicUpdate(g2d); 


      ///////////////////////////DEBUG DISPLAY/////////////////////////////// 
      //g2d.drawString("Debug2: " + blah, 100, 150); 
      g2d.drawString("" + keyboard.test, 100, 100);//draws whether or not the method has fired to the screen 
      g2d.drawString("" + keymanager, 100, 125); 

      while(timer > System.currentTimeMillis()); 
      timer = System.currentTimeMillis() + 20; 
      gwindow.setBuffer(backbuffer); 

     } 

    } 

    public void setFadeMode(int mode){ 

     this.fademode = mode; 
     if(fadeMode() == DARK)setFadeAlpha(255); 
     if(fadeMode() == CLEAR)setFadeAlpha(0); 

    } 

    public void setFadeAlpha(int b){ 

     this.fadealpha = b; 

    } 

    public int fadeMode(){ 

     return fademode; 

    } 

    public int fadeAlpha(){ 

     return fadealpha; 

    } 

    protected void wipeScreen(Graphics2D g2d){ 

     g2d.setColor(Color.BLACK); 
     g2d.fillRect(0, 0, gwindow.getWidth(), gwindow.getHeight()); 

    } 

} 

재미있는 무언가는 큰 응용 프로그램을 실행할 때도 발생합니다. 내가 누르는 키는 내 컴파일러 (일식)에 입력됩니다. 마치 내 키보드 포커스가 전체적으로 컴파일러에있는 것처럼 보입니다.

지금 당장 내 가장 좋은 짐작은 KeyEventDispatcher이 대기열에서 너무 멀리 떨어져 있다는 것입니다. 따라서 모든 키 이벤트는 발송자에게 전달 될 때 처리되지만, 완전히 잘못 될 수 있습니다. 내 질문에, 왜 KeyEventDispatcher 하나의 응용 프로그램에서 작동하지 않는 다른, 그리고 어떻게 둘 다 작동하도록 얻을 수 있습니까?

+0

해결 했습니까? 제공 한 코드에는 여러 가지 해결되지 않은 유형이 있습니다. – Zecas

+0

예. KeyEventDispatcher가 어떤 이벤트도 가로 채지 않았 음을 의미하는, 키보드 포커스를 잡는 능력이 없었던 내가 사용한 윈도우 클래스. 너무 많은 미해결 유형이 있고 (주어진 정보를 기반으로 솔루션이 명확하지 않은) 이유는 전체 프로그램을 게시하지 않았기 때문입니다. 아주 큰 게시물이었을 것입니다. JFrame으로 전환하는 것이 트릭입니다. – Zistack

답변

0

그래서 소유자가없는 JWindow를 사용했기 때문에 내 프로그램에서 키보드 포커스를 잡지 못하여 파견 할 이벤트가 없었습니다. 꾸며지지 않은 JFrame으로 바꾸는 것이 트릭을 만들었습니다.

지 스탁

관련 문제