Java JApplet可以';从浏览器运行时无法获得焦点

Java JApplet可以';从浏览器运行时无法获得焦点,java,swing,focus,japplet,appletviewer,Java,Swing,Focus,Japplet,Appletviewer,我有一些简单的代码,试图将键盘事件放入Java小程序中。当使用appletviewer运行时,代码运行得很好,但是当我从浏览器(尝试了Chrome和Firefox)加载它时,JApplet不会关注单击 用Applet而不是JApplet尝试完全相同的代码不会有问题 这是我的密码: import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Test extends JApplet { St

我有一些简单的代码,试图将键盘事件放入Java小程序中。当使用appletviewer运行时,代码运行得很好,但是当我从浏览器(尝试了Chrome和Firefox)加载它时,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);
    }
}
  • 应通过在
    SwingUtilities.invokeAndWait()
    块中覆盖
    init()
    方法中包装代码,在上创建小程序

  • 不要对
    JApplet
    /Swing组件使用
    keylister

  • 在创建所有内容并将其添加到容器后,在
    JApplet
    上调用
    requestFocusInWindow()

  • 也不要在
    paint()
    中绘制,而是将
    JPanel
    添加到容器中并覆盖
    paintComponent(…)

这里有一个小例子,它是一个简单的
JLabel
,其中一个虚拟标签和文本字段添加到容器中,并且只有一个
KeyBinding
;因此,当按下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();
        }
    }
}


大卫,谢谢你的建议,但是你的例子和我的一样。从浏览器运行时,除非单击JTextField,否则小程序不会获得焦点。从appletviewer运行时,无需单击文本字段即可获得焦点。我还尝试使用KeyBinding API而不是KeyEventListener,但问题是焦点,requestFocusInWindow()总是返回false。@lonutnicu所以当您在浏览器中打开小程序并按a键时,什么都没有发生?…如果您希望jtextfield聚焦,而不是在TextField上调用requestFocusInWindow否,我希望小程序聚焦,不是文本字段。我甚至不想有一个文本字段。事实上,当我从浏览器中打开它并按下“a”时,什么都没有发生。如果我用applet viewer运行它并按“a”,它就会工作。就像在我的例子中一样。我不确定我能做些什么,在Windows7x64Java7U9和IE8/Chrome上进行了测试,它对我来说很好,所以必须做些别的事情确保你使用的应用程序的所有版本都是最新的。我这里有Ubuntu 12.10x86_64,并在Chrome 23.0.1271.95(官方版本169798)和Firefox 17.0.1上进行了测试。这可能是平台特定的问题。明天我将使用Windows虚拟机进行测试并发布结果。谢谢