我正在努力寻找一种将c#中的void keypressed翻译成java而没有任何成功但又有人闷闷不乐的想法?
我希望当我按下键13(输入)时,Private void doen()会激活一次。
import java.awt.event.*;
import javax.swing.JTextField;
import javax.swing.*;
import java.awt.*;
import java.awt.Toolkit;
import java.util.Timer;
import java.util.TimerTask;
public class Paneel extends JPanel {
private static final long serialVersionUID = 1L;
String text;
String AccountName = "default";
String autosavecheck = "";
String iss;
JProgressBar monsterbar, progressbar;
JButton sendknop, clearknop, creditsknop, saveknop, loadknop, restartknop,
disableautosaveknop;
JTextArea commandstextbox, dialoogtextbox;
JTextField naamtextbox, invoertextbox;
JOptionPane resetdialog;
Toolkit toolkit;
Timer timer;
public Paneel() {
setLayout(null);
// --------------------------------
dialoogtextbox = new JTextArea();
dialoogtextbox.setFont(new Font("sansserif", Font.BOLD, 12));
dialoogtextbox.setBounds(12, 12, 838, 207);
dialoogtextbox.list();
invoertextbox = new JTextField(12);
invoertextbox.setBounds(12, 330, 982, 20);
invoertextbox.setEnabled(false);
commandstextbox = new JTextArea();
commandstextbox.setBounds(856, 28, 138, 191);
naamtextbox = new JTextField(12);
naamtextbox.setBounds(772, 263, 220, 20);
toolkit = Toolkit.getDefaultToolkit();
timer1 = new Timer();
toolkit = Toolkit.getDefaultToolkit();
autosave = new Timer();
toolkit = Toolkit.getDefaultToolkit();
monstertimer = new Timer();
toolkit = Toolkit.getDefaultToolkit();
autodisabletimer = new Timer();
sendknop = new JButton("Send");
sendknop.setBounds(12, 260, 75, 23);
sendknop.addActionListener(new sendknopHandler());
add(sendknop);
}
private void keypressed() {
if (e.KeyChar == (char) Keys.Return) {
doen();
}
}
private void doen() {
text = invoertextbox.getText();
invoertextbox.setText("");
}
}
答案 0 :(得分:2)
如果您想在按下JButton
后调用该方法,则必须向ActionListener
添加JButton
并在actionPerformed(ActionEvent ae)
内调用该方法像这样:
jBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("called");
//call method here
}
});
或者如果您想在JPanel
使用KeyBindings而不是像KeyListener
这样按下按键时调用该方法:
JPanel panel=...;
...
panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0), "send");
panel.getActionMap().put("send", new MyAction());
...
class MyAction extends AbstractAction {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("called");
//call method here
}
}
答案 1 :(得分:2)
尽可能地,您可以尝试多种方法。您没有真正指定您有兴趣监控哪个组件,因此我们向您提出了一些不同的建议......
在以下示例key bindings示例和RootPane
的默认按钮中。
不幸的是,JTextArea
在通知根窗格之前会使用回车键,这意味着它不会触发。这是文本字段的一般问题,因为它们响应了回车键操作。
您将面临的另一个问题是我已经覆盖了JtextField
的输入键的默认行为,这意味着它将不再插入新行。
public class TestPane extends JPanel {
private JTextArea textArea;
private JButton doneButton;
public TestPane() {
textArea = new JTextArea(10, 50);
doneButton = new JButton("Done");
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1;
gbc.weighty = 1;
gbc.fill = GridBagConstraints.BOTH;
gbc.insets = new Insets(4, 4, 4, 4);
add(new JScrollPane(textArea), gbc);
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 1;
gbc.insets = new Insets(4, 4, 4, 4);
add(doneButton, gbc);
InputMap inputMap = textArea.getInputMap(JComponent.WHEN_FOCUSED);
ActionMap actionMap = textArea.getActionMap();
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "enter");
actionMap.put("enter", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("I'm done here");
}
});
doneButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("All the way out...");
}
});
}
@Override
public void addNotify() {
super.addNotify();
// This is the button that will be activate by "default", depending on
// what that means for the individual platforms...
SwingUtilities.getRootPane(this).setDefaultButton(doneButton);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception exp) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
frame.setLocationRelativeTo(null);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.setVisible(true);
}
});
}
}
答案 2 :(得分:1)
首先:确保您的格式正确,请参阅插入代码段的说明。帮助我们这些阅读它的人:)
我不完全确定你在这里问的是什么,但我想你是想让你的程序响应用户点击你的任何按钮。这发生在按钮应具有的各种ActionListener中。例如,在您的情况下,sendknopHandler应包含处理用户按下此特定按钮时发生的事情的逻辑。在这个课程中,你必须过滤出动作的来源(即按下按钮),动作是什么,以及你想如何回应。
答案 3 :(得分:1)
了解有关听众的所有内容以及更具体的key listeners
答案 4 :(得分:1)
“键13”是按钮还是当用户输入“13”时?
如果是按钮,只需使用
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
your statements;
}
}
否则使用关键听众彼得回应。
答案 5 :(得分:1)
a)public Paneel() {
在代码行}
之后遗漏add(sendknop);
,问题与public class Paneel extends JPanel {
相同,
b)从这段代码到这种形式你永远不会听任何事件,因为代码不可运行,你的问题是关于Java Basic,不是关于Swing GUI,关于监听器
c)要收听ENTER
密钥,您必须将ActionListener添加到JButton
d)Swing GUI
必须使用Swing Timer代替util.Timer
,否则您会遇到Concurency in Swing
e)对于Swing GUI,不要使用KeyListener,有KeyBindings并且输出到Swing Action
f)否则Swing JComponents
获得Focus in the Window
KeyListener
答案 6 :(得分:0)
通过将以下行添加到代码的初始化部分,为invoertextbox
添加一个键监听器:
invoertextbox.addKeyListener(this);
然后通过添加:
扩展您的类实现KeyListener
接口
import java.awt.event.KeyListener;
public class Paneel extends JPanel implements KeyListener {
在Paneel
类中实现以下接口方法:
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode()==KeyEvent.VK_ENTER) {
doen();
}
}
@Override
public void keyReleased(KeyEvent e) {
}
private void doen() {
text = invoertextbox.getText();
invoertextbox.setText("");
}
请考虑使用keyTyped(KeyEvent)
代替keyPressed(KeyEvent)
。
“键入类型”事件是更高级别的,通常不依赖于 平台或键盘布局。它们是在Unicode时生成的 输入字符,是了解的首选方式 字符输入。在最简单的情况下,生成键类型事件 通过单键按下(例如,'a')[...](JavaDoc for KeyEvent)