2012-12-06 62 views
2

我有一些簡單的代碼,我試圖將鍵盤事件放入Java小程序中。使用appletviewer運行時,代碼運行得很好,但是當我從瀏覽器加載它時(同時嘗試使用Chrome和Firefox),JApplet不會將焦點放在點擊上。從瀏覽器運行JApplet無法獲得焦點

嘗試與Applet完全相同的代碼而不是JApplet可以正常工作。

這裏是我的代碼:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class Test extends JApplet { 
    String s = ""; 

    public void init() { 
      setFocusable(true); 
      setEnabled(true); 
      addKeyListener(new KeyAdapter() { 
        @Override 
        public void keyPressed(KeyEvent e) { 
          s = "KEY PRESSED: " + e.getKeyCode(); 
          repaint(); 
        } 

      }); 
      addMouseListener(new MouseAdapter() { 
        @Override 
        public void mousePressed(MouseEvent e) { 
          boolean ret = requestFocusInWindow(); 
          s = "requestFocusInWindow: " + ret; 
          repaint(); 
        } 
      }); 
      requestFocusInWindow(); 
    } 

    public void start() { 
      requestFocusInWindow(); 
    } 

    public void paint(Graphics g) { 
      super.paint(g); 
      requestFocusInWindow(); 
      g.setColor(Color.BLACK); 
      s = "Focus owner: " + isFocusOwner() + ", " + s; 
      g.drawString(s, 24, 24); 
    } 
} 

回答

2
  • 小程序應Event Dispatch Thread通過環繞重寫init()方法代碼SwingUtilities.invokeAndWait()

  • 不使用KeyListenerJApplet/Swing組件來創建使用KeyBindings

  • 呼叫JAppletrequestFocusInWindow()創建和添加所有內容的容器後(這是沒有必要使用,雖然鍵綁定)

  • 而且不這樣做在paint()繪圖,而添加JPanel到容器中,並覆蓋paintComponent(..)

這裏一個小例子,其簡單的JLabel與虛擬標籤和文本框添加到容器與KeyBinding只有;所以當按下一個它會被添加到JLabel文本:

enter image description here

import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import java.lang.reflect.InvocationTargetException; 
import javax.swing.AbstractAction; 
import javax.swing.JApplet; 
import javax.swing.JComponent; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 
import javax.swing.KeyStroke; 
import javax.swing.SwingUtilities; 

public class Test extends JApplet { 

    @Override 
    public void init() { 
     try { 
      SwingUtilities.invokeAndWait(new Runnable() { 
       @Override 
       public void run() { 

        final JLabel label = new JLabel("Text:"); 
        final JLabel label2 = new JLabel("Dummy label"); 
        final JTextField jtf = new JTextField("Dummy Field"); 
        label2.setFocusable(true); 
        label.setFocusable(true); 

        //allwos user to add letter A to JLabel 
        label.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0), "A"); 
        label.getActionMap().put("A", new AbstractAction() { 
         @Override 
         public void actionPerformed(ActionEvent ae) { 
          String tmp = label.getText(); 
          label.setText(tmp + "A"); 

         } 
        }); 

        setLayout(new GridLayout(3, 1)); 

        add(label); 
        add(label2); 
        add(jtf); 
       } 
      }); 
     } catch (InterruptedException | InvocationTargetException ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 
+0

大衛,感謝您的建議,但你的例子顯示了相同的行爲,我的。從瀏覽器運行時,除非您單擊JTextField,否則applet不會獲得焦點。當從appletviewer運行時,它將獲得焦點而無需點擊文本字段。我嘗試使用KeyBinding API而不是KeyEventListener,但問題是焦點,requestFocusInWindow()總是返回false。 –

+0

@lonutnicu所以當你在你的瀏覽器中打開applet並按下* a *什麼都沒有發生?......如果你想讓jtextfield專注於調用requestFocusInWindow文本域 –

+0

不,我想讓applet專注,而不是文本字段。我甚至不想擁有一個文本字段。事實上,當我從瀏覽器打開並按'a'時,什麼也沒有發生。如果我使用applet查看器運行它,然後按'a',它將起作用。就像我的例子。 –