JApplet和KeyListener

我正在为我的计算机科学课开发一个应用程序。 任务是编写计算器但不使用JTextFieldJTextArea 。 我想出了实现KeyListener的想法,它在appletviewer和JFrame中都运行良好,但在Google Chrome (可能还有其他浏览器) 中根本不起作用

这是我的代码片段。

 //- BinaryCalc.java import javax.swing.*; import javax.swing.event.*; import java.awt.*; import java.awt.event.*; public class BinaryCalc extends JApplet implements KeyListener { private JPanel panel; public BinaryCalc() { super(); panel = new JPanel(); this.add(panel); panel.addKeyListener(this); panel.requestFocusInWindow(); } @Override public void init() { JOptionPane.showMessageDialog(this, "applet"); panel.setFocusable(true); panel.requestFocus(); } public void keyPressed(KeyEvent e) { JOptionPane.showMessageDialog(this, (char) e.getKeyCode()); } public void keyReleased(KeyEvent e) {} public void keyTyped(KeyEvent e) {} public JPanel getPanel() { return panel; } public static void main(String args[]) { JFrame frame = new JFrame("Binary Calculator"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setMinimumSize(new Dimension(320, 240)); BinaryCalc kalkulator = new BinaryCalc(); frame.add(kalkulator); frame.pack(); frame.setVisible(true); kalkulator.getPanel().requestFocusInWindow(); } } 

和包含我的applet的HTML文件。

      Kalkulator binarny   

Kalkulator Binarny


<!--- --> What a terrible failure: applet failed to load!

有任何想法吗?

  • 使用KeyBindings而不是KeyListener

  • 不要为JApplet创建自己的JFrame ,只需在applet实例上调用getContentPane()并在那里添加所有组件。

  • 所有组件都应该在包含在SwingUtilities#invokeAndWait(..)块中的JApplet覆盖init()方法中创建

  • JAppletApplet没有main(..)方法(除了测试目的)

  • 使用requestFocusInWindow()而不是requestFocus()

我强烈建议你阅读:

  • 如何制作小程序
  • JApplet教程

这是一个适合我的例子。 它只是向JPanel添加了一个不可编辑的JTextField ,然后将KeyBindingKeyEvent.VK_1 KeyBinding添加到JPanel 。 如果用户键入01 ,它将显示在不可编辑的JTextField

在此处输入图像描述

 import java.awt.BorderLayout; import java.awt.event.*; import java.lang.reflect.InvocationTargetException; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.*; public class BinaryCalc extends JApplet { private JTextField jtf; @Override public void init() { try { SwingUtilities.invokeAndWait(new Runnable() { @Override public void run() { JPanel panel = new JPanel(); setKeyBindings(panel); jtf = new JTextField(10); //so we cant edited it without pressing a key jtf.setEditable(false); panel.add(jtf); getContentPane().add(panel, BorderLayout.CENTER); panel.requestFocusInWindow();//incase we lost focus } }); } catch (InterruptedException ex) { Logger.getLogger(BinaryCalc.class.getName()).log(Level.SEVERE, null, ex); } catch (InvocationTargetException ex) { Logger.getLogger(BinaryCalc.class.getName()).log(Level.SEVERE, null, ex); } } private void setKeyBindings(final JPanel panel) { panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_0,0), "0"); panel.getActionMap().put("0", new AbstractAction() { @Override public void actionPerformed(ActionEvent ae) { String tmp = jtf.getText(); jtf.setText(tmp + "0"); } }); panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_1,0), "1"); panel.getActionMap().put("1", new AbstractAction() { @Override public void actionPerformed(ActionEvent ae) { String tmp = jtf.getText(); jtf.setText(tmp + "1"); } }); } } 

我冒昧地转换@ David的有用示例来使用标签和数字键盘。

更新:此混合可在Ubuntu / OpenJDK上运行,并且可以通过Java Web Start进行部署。

 import java.awt.BorderLayout; import java.awt.Container; import java.awt.EventQueue; import java.awt.event.*; import javax.swing.*; /** * @see https://stackoverflow.com/a/13363349/230513 */ public class BinaryCalc extends JApplet { private static BinaryCalc bc = new BinaryCalc(); private JLabel label = new JLabel("0000000000"); public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { JFrame frame = new JFrame(); frame.setTitle("BinaryCalc"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); initContainer(frame); frame.pack(); bc.label.setText(""); frame.setVisible(true); } }); } // Common initialization for either JApplet or JFrame private static void initContainer(Container container) { JPanel panel = new JPanel(); bc.setKeyBindings(panel); panel.add(bc.label); container.add(panel, BorderLayout.CENTER); panel.requestFocusInWindow(); } @Override public void init() { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { initContainer(BinaryCalc.this); } }); } private void setKeyBindings(final JPanel panel) { panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .put(KeyStroke.getKeyStroke(KeyEvent.VK_0, 0), "0"); panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD0, 0), "0"); panel.getActionMap().put("0", new AbstractAction() { @Override public void actionPerformed(ActionEvent ae) { String tmp = label.getText(); label.setText(tmp + "0"); } }); panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .put(KeyStroke.getKeyStroke(KeyEvent.VK_1, 0), "1"); panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD1, 0), "1"); panel.getActionMap().put("1", new AbstractAction() { @Override public void actionPerformed(ActionEvent ae) { String tmp = label.getText(); label.setText(tmp + "1"); } }); } }