java – JApplet和KeyListener
作者:互联网
我正在为我的计算机科学课开发一个应用程序.任务是编写计算器,但不使用JTextFields或JTextAreas.我想出了实现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文件.
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Kalkulator binarny</title>
</head>
<body>
<div style="text-align: center; border-bottom: 1px solid black">
<h1>Kalkulator Binarny</h1>
</div>
<br/>
<object style="display: block; margin: auto;" type="application/x-java-applet" width="320" height="240">
<param name="code" value="BinaryCalc.class" />
<!--- <param name="archive" value="Liczba.jar" /> -->
What a terrible failure: applet failed to load!
</object>
<br/>
</body>
</html>
有任何想法吗?
解决方法:
>使用KeyBindings
而不是KeyListener
>不要为JApplet创建自己的JFrame,只需在applet实例上调用getContentPane()并在那里添加所有组件.
>所有组件都应该在包含在SwingUtilities#invokeAndWait(..)
块中的JApplet覆盖init()方法中创建
> JApplets和Applet没有main(..)方法(除了测试目的)
>使用requestFocusInWindow()而不是requestFocus()
我强烈建议你阅读:
> How to Make Applets
> JApplet tutorial
这是一个适合我的例子.它只是将一个不可编辑的JTextField添加到JPanel,然后将KeyEvent.VK_0和KeyEvent.VK_1的KeyBindings添加到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");
}
});
}
}
标签:java,swing,jframe,keylistener,japplet 来源: https://codeday.me/bug/20190718/1494374.html