2009-11-02 4 views
3

키보드 이벤트를 수신하기 위해 JApplet 내 JPanel을 가져올 수 없습니다. 나는 왜 그럴 수 없는가! 차이가 없습니다 입력하기 전에 ... (마우스) 패널을 클릭JApplet/JPanel에서 KeyListener 이벤트를받지 못했습니다!

  1. 참고. 이것은 넷에서 볼 수있는 가장 일반적인 조언입니다.

  2. '저수준'java.awt.KeyEventDispatcher 인터페이스를 사용해 보았습니다. 그것은 전혀 다르지 않습니다!

  3. 그러나 JApplet 대신 애플릿을 사용하면 애플릿은 키보드 이벤트를받습니다. 하지만 여기에도, 내가이 Applet에 Panel을 추가하는 순간 (Panel은 실제로 모든 App/Painting 로직이있는 곳입니다), 다시 한번 (Panel에서) kb 이벤트 수신을 중단합니다!

  4. 이제는 onPaint가 Graphics2D 객체 대신 Graphics를 가져 오기 때문에 단순히 JApplet 대신 Applet을 사용할 수 없습니다. 그래서 # 3은 나를위한 해결책이 아닙니다.

  5. JDK와 함께 제공되는 AppletViewer의 기능은 매력처럼 작동합니다.

나는 여기 누군가의 도움이 절실히 필요합니다. 지난 2-3 일 동안 모든 종류의 순열을 시험해 보았습니다. 지금은 기억조차하지 않습니다.

내 플랫폼 세부 정보 :

  1. 파이어 폭스 3.5.3

  2. 페도라

  3. 자바 플러그인이 x86에서 (최신 업데이트/패치) (11) :이 두 가지를 시도, 아무런 차이가 없었다.

    3.1 IcedTea 자바 웹 브라우저 플러그인 1.6 (페도라-29.b16.fc11-I386)

    3.2 jdk1.6.0_16/JRE/플러그인/I386/NS7/libjavaplugin_oji.so

  4. 사용 내 애플릿 소스를 컴파일하려면 jdk1.6.0_16 위.

여기 내 코드가 있습니다. 동료 프로그래머의 의견을 듣고 싶습니다 ... 완전히 붙어 있습니다!

감사합니다,

/SD

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

import javax.swing.*; 
import javax.swing.event.*; 


class MyAppletKeyListener implements KeyListener, MouseListener { 

    public void keyPressed(KeyEvent e) { 
    System.out.println("panel:keyPressed" + e.getKeyChar()); 
    } 
    public void keyReleased(KeyEvent e) { 
    } 
    public void keyTyped(KeyEvent e) { 
    System.out.println("panel:keyTyped" + e.getKeyChar()); 
    } 

    public void mouseClicked(MouseEvent e) { 
    System.out.println("panel:mouseClicked"); 
    } 
    public void mouseEntered(MouseEvent e) { } 
    public void mouseExited(MouseEvent e) { } 
    public void mousePressed(MouseEvent e) { } 
    public void mouseReleased(MouseEvent e) { } 
} 


public class TestApplet extends JApplet implements MouseListener { 
    public void init() { 
    System.out.println("applet:init"); 

    MyAppletKeyListener listener = new MyAppletKeyListener(); 

    // Panel related 
    // Note: I'd like this red panel to handle 
    // all my keyboard and mouse events. 
    JPanel panel = new JPanel(); 
    panel.setLayout(new FlowLayout()); 
    panel.add(new JButton("test")); 
    panel.add(new JButton("test2")); 
    panel.setFocusable(true); 
    panel.requestFocus(); 
    panel.setBackground(new Color(200, 0, 0)); 
    panel.addKeyListener(listener); 
    panel.addMouseListener(listener); 

    // applet related 
    // Note: Added this only for debugging. I do NOT want 
    // to handle my mouse/kb events in the applet. 
    addMouseListener(this); 
    getContentPane().setLayout(new FlowLayout()); 
    getContentPane().add(panel); 

    } 

    public void mouseClicked(MouseEvent e) { 
    System.out.println("applet:mouseClicked"); 
    } 
    public void mouseEntered(MouseEvent e) { } 
    public void mouseExited(MouseEvent e) { } 
    public void mousePressed(MouseEvent e) { } 
    public void mouseReleased(MouseEvent e) { } 
} 

html로 :

<html> 
    <head> 
    </head> 
    <body> 
    <applet id="myApplet" code="TestApplet.class" 
     width="425" 
     height="150" > 
    </applet> 
    </body> 
</html> 
+1

코드는 Applet Viewer, Win XP, Java 1.6.0_16을 사용하여 저에게 적합합니다. – Pool

+0

안녕하세요, Nick, 위의 노트 # 5에서 말했듯이 애플릿 뷰어에서도 잘 작동합니다. – Harry

+2

죄송합니다. 난 그냥 XP에서 브라우저, FF3.5, IE8 및 크롬 3에서 그것을 테스트하고 그들은 모두 나를 위해 괜찮 았어. 그것은 페도라의 플러그인 문제로 꽤 고립 된 것처럼 보입니다. – Pool

답변

3

내가 인터넷에서 이걸 발견하고 나를 위해 문제를 해결 :

을 KeyListener가 수행하는 사실은 이 아닙니다. 애플릿의 경우와 마찬가지로 JApplet에서 작동하므로 KeyEventDispatcher 인터페이스를 사용해야합니다.

public class AppletMain extends JApplet implements 

java.awt.KeyEventDispatcher

또한 당신은 인터페이스의 dispatchKeyEvent에 함수를 오버라이드 (override) 패널 이후

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this); 

에 의 KeyboardFocusManager를 설정해야합니다 :

@Override 
public boolean dispatchKeyEvent(KeyEvent e); 

KeyListener와 마찬가지로 KeyEvents 을 잡을 수 있습니다.

1

이 문제는 우분투 9.04와 10.10 모두에서 firefox 버전 3.6.11 및 3.6.14가있는 sun-java-6 패키지와 openjdk 패키지에서 발생했습니다. 두 가지 해결 방법을 발견했습니다 : JApplet보다는 애플릿을 사용하거나, mousePressed (..) 함수에서 "requestFocus()"를 호출하는 MouseListener를 구현하십시오.

2

나는 현재 프로젝트와 관련된 문제를 조사하고 JApplet 클래스의 집중력에 대한 몇 가지 문제를 탐구했다.
setFocusable(true);이 문제를 결정했기 때문입니다.
requestFocusInWindow();과 같은 포커스 캡처 호출을 추가해야 제대로 작동합니다.

+0

setFocusable (true) 나를 위해 일했습니다. 감사! – Pikamander2

관련 문제