使用按键激活事件

时间:2012-09-24 08:11:00

标签: java swing keypress keylistener

我正在努力寻找一种将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("");
    }
}

7 个答案:

答案 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