JApplet和KeyListener
我正在为我的计算机科学课开发一个应用程序。 任务是编写计算器但不使用JTextField
或JTextArea
。 我想出了实现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()
方法中创建 -
JApplet
和Applet
没有main(..)
方法(除了测试目的) -
使用
requestFocusInWindow()
而不是requestFocus()
我强烈建议你阅读:
- 如何制作小程序
- JApplet教程
这是一个适合我的例子。 它只是向JPanel
添加了一个不可编辑的JTextField
,然后将KeyBinding
和KeyEvent.VK_1
KeyBinding
添加到JPanel
。 如果用户键入0或1 ,它将显示在不可编辑的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"); } }); } }