2

キーボード イベントを Java アプレットに取り込もうとしている単純なコードがいくつかあります。このコードは、appletviewer で実行すると問題なく動作しますが、ブラウザーからロードすると (Chrome と Firefox の両方を試しました)、JApplet はクリックにフォーカスしません。

JApplet の代わりに Applet を使用してまったく同じコードを試しても、問題なく動作します。

これが私のコードです:

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);
    }
}
4

1 に答える 1

2
  • アプレットは、ブロックEvent Dispatch Thread内のオーバーライドされたinit()メソッドでコードをラップすることによって作成する必要がありますSwingUtilities.invokeAndWait()

  • /Swing コンポーネントKeyListener使用には使用しないでくださいJAppletKeyBinding

  • すべてのコンテンツを作成してコンテナーに追加requestFocusInWindow()した後に呼び出します(ただし、これはキーバインドでは必要ありません)JApplet

  • paint()また、コンテナーに追加JPanelしてオーバーライドするのではなく、描画を行わないでくださいpaintComponent(..)

これは小さな例です。JLabelダミーのラベルとテキストフィールドがKeyBindingforAのみでコンテナに追加された単純なものです。Aが押されると、JLabelテキストに追加されます。

ここに画像の説明を入力

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();
        }
    }
}
于 2012-12-06T17:28:54.137 に答える