JApplet amp; KeyListener(JApplet amp;按键监听器)
问题描述
我正在为我的计算机科学课程开发一个应用程序.任务是编写一个计算器,但不使用 JTextField
s 或 JTextArea
s.我想出了一个实现 KeyListener
的想法,它 在 appletviewer 和 JFrame
中都很好用,但在 Google Chrome 中根本不起作用(可能还有其他浏览器).
I'm developing an application for my computer science classes. The task is to write a calculator but without using JTextField
s or JTextArea
s. I've come up with an idea of implementing KeyListener
which works nice in both appletviewer and JFrame
but doesn't work at all in Google Chrome (and probably other browsers).
这是我的代码片段.
//- 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();
}
}
还有包含我的小程序的 HTML 文件.
And HTML file containing my applet.
<!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>
有什么想法吗?
推荐答案
我冒昧地将@David 的有用示例转换为使用标签和数字键盘.
I took the liberty of converting @David's helpful example to use a label and the numeric keypad.
更新:这个hybrid适用于Ubuntu/OpenJDK,可以通过Java Web Start.
Update: This hybrid works on Ubuntu/OpenJDK, and it can be deployed via 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");
}
});
}
}
这篇关于JApplet &按键监听器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:JApplet &按键监听器
基础教程推荐
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01