gpt4 book ai didi

java - JApplet & KeyListener

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:48:47 27 4
gpt4 key购买 nike

我正在为我的计算机科学类(class)开发一个应用程序。任务是编写一个计算器,但不使用 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();
}

}

以及包含我的小程序的 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() 并在其中添加所有组件.

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

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

  • 使用 requestFocusInWindow() 代替 requestFocus()

我强烈建议您阅读:

这是一个适合我的例子。它只是将不可编辑的 JTextField 添加到 JPanel,然后为 KeyEvent.VK_0 添加 KeyBindingKeyEvent.VK_1JPanel。如果用户键入 01 它将显示在不可编辑的 JTextField 中:

enter image description here

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 - JApplet & KeyListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13363208/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com