Rob*_*n92 3 java swing keylistener jframe japplet
我正在为我的计算机科学课开发一个应用程序.任务是编写计算器,但不使用JTextField
s或JTextArea
s.我想出了一个实现的想法,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();
}
}
Run Code Online (Sandbox Code Playgroud)
和包含我的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>
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
使用KeyBindings
与否KeyListener
不要JFrame
为applet实例上的JApplet
简单调用创建自己的,getContentPane()
并在那里添加所有组件.
应该在包含在块中的JApplet
overriden init()
方法中创建所有组件SwingUtilities#invokeAndWait(..)
JApplet
s和Applet
s没有main(..)
方法(除了测试目的)
用requestFocusInWindow()
而不是requestFocus()
我强烈建议你阅读:
这是一个适合我的例子.它只是增加了一个不可编辑JTextField
的JPanel
,然后添加KeyBinding
S表示KeyEvent.VK_0
和KeyEvent.VK_1
到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");
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
我冒昧地转换@ 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");
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1968 次 |
最近记录: |