it-swarm.com.de

Zulassen, dass die Eingabetaste die Senden-Taste drückt, anstatt nur MouseClick zu verwenden

Ich lerne jetzt Swing-Klasse und alles darüber. Ich habe dieses Spielzeugprogramm, das ich zusammengestellt habe, auf die Eingabe eines Namens und daraufhin ein JOptionPane mit der Meldung "You have here (Your Name)" ... angezeigt , aber ich möchte, dass es auch mit der Eingabetaste funktioniert. Ich habe versucht, einen KeyListener hinzuzufügen, wie in dem von mir verwendeten Java-Buch empfohlen (Eventful Java, Bruce Danyluk und Murtagh).

NamePromptenter image description here

Das ist mein Code:

import Java.awt.BorderLayout;
import Java.awt.event.ActionEvent;
import Java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class NamePrompt extends JFrame{


    private static final long serialVersionUID = 1L;

    String name;

    public NamePrompt(){

        setLayout(new BorderLayout());

        JLabel enterYourName = new JLabel("Enter Your Name Here:");
        JTextField textBoxToEnterName = new JTextField(21);
        JPanel panelTop = new JPanel();
        panelTop.add(enterYourName);
        panelTop.add(textBoxToEnterName);

        JButton submit = new JButton("Submit");
        submit.addActionListener(new SubmitButton(textBoxToEnterName));
        submit.addKeyListener(new SubmitButton(textBoxToEnterName));
        JPanel panelBottom = new JPanel();
        panelBottom.add(submit);

        //Add panelTop to JFrame
        add(panelTop, BorderLayout.NORTH);
        add(panelBottom, BorderLayout.SOUTH);

        //JFrame set-up
        setTitle("Name Prompt Program");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);


    }



    public static void main(String[] args) {
        NamePrompt promptForName = new NamePrompt();
        promptForName.setVisible(true); 
    }


}

Und das ist der actionListener, keyListener-Klasse:

import Java.awt.Component;
import Java.awt.event.ActionEvent;
import Java.awt.event.ActionListener;
import Java.awt.event.KeyEvent;
import Java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;


public class SubmitButton implements ActionListener, KeyListener {

    JTextField nameInput;


    public SubmitButton(JTextField textfield){
        nameInput = textfield;
    }

    @Override
    public void actionPerformed(ActionEvent submitClicked) {

        Component frame = new JFrame();
        JOptionPane.showMessageDialog(frame , "You've Submitted the name " + nameInput.getText());
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode()==KeyEvent.VK_ENTER){
            System.out.println("Hello");
        }
        Component frame = new JFrame();
        JOptionPane.showMessageDialog(frame , "You've Submitted the name " + nameInput.getText());

    }

    @Override
    public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyTyped(KeyEvent arg0) {

    }
}
42
CodyBugstein

Dafür gibt es einen einfachen Trick. Nachdem Sie den Rahmen mit allen Schaltflächen erstellt haben, gehen Sie folgendermaßen vor:

frame.getRootPane().setDefaultButton(submitButton);

Für jedes Bild können Sie eine Standardschaltfläche festlegen, die automatisch die Eingabetaste abhört (und möglicherweise auch eines anderen Ereignisses, das mir nicht bewusst ist). Wenn Sie die Eingabetaste in diesem Frame drücken, werden die ActionListener mit ihrer actionPerformed()-Methode aufgerufen.


Und das Problem mit Ihrem Code ist meines Erachtens, dass Ihr Dialog jedes Mal angezeigt wird, wenn Sie eine Taste drücken, weil Sie ihn nicht in den Wenn-Körper gestellt haben. Versuchen Sie es so zu ändern:

@Override
public void keyPressed(KeyEvent e) {
    if (e.getKeyCode()==KeyEvent.VK_ENTER){
        System.out.println("Hello");

        JOptionPane.showMessageDialog(null , "You've Submitted the name " + nameInput.getText());
    }

}

UPDATE: Ich habe festgestellt, was mit Ihrem Code falsch ist. Sie fügen den Schlüssellistener der Schaltfläche "Senden" und nicht dem Textfeld hinzu. Ändern Sie Ihren Code folgendermaßen:

SubmitButton listener = new SubmitButton(textBoxToEnterName);
textBoxToEnterName.addActionListener(listener);
submit.addKeyListener(listener);
100

Możesz użyć panelu głównego kontenerów najwyższego poziomu, aby ustawić domyślny przycisk, który pozwoli mu odpowiedzieć na enter.

SwingUtilities.getRootPane(submitButton).setDefaultButton(submitButton);

To oczywiście zakłada, że ​​przycisk został dodany do prawidłowego kontenera;)

UPDATED

Jest to podstawowy przykład przy użyciu interfejsu API JRootPane#setDefaultButton i klawiszy powiązań

public class DefaultButton {

    public static void main(String[] args) {
        new DefaultButton();
    }

    public DefaultButton() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class TestPane extends JPanel {

        private JButton button;
        private JLabel label;
        private int count;

        public TestPane() {

            label = new JLabel("Press the button");
            button = new JButton("Press me");

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridy = 0;
            add(label, gbc);
            gbc.gridy++;
            add(button, gbc);
            gbc.gridy++;
            add(new JButton("No Action Here"), gbc);

            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    doButtonPressed(e);
                }

            });

            InputMap im = button.getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
            ActionMap am = button.getActionMap();

            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "spaced");
            am.put("spaced", new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    doButtonPressed(e);
                }

            });

        }

        @Override
        public void addNotify() {
            super.addNotify();
            SwingUtilities.getRootPane(button).setDefaultButton(button);
        }

        protected void doButtonPressed(ActionEvent evt) {
            count++;
            label.setText("Pressed " + count + " times");
        }

    }

}

To oczywiście zakłada, że ​​fokus komponentu nie zużywa danego zdarzenia kluczowego (jak drugi przycisk zużywającyspacelubenterklawiatura

12
MadProgrammer

In der ActionListener-Klasse können Sie einfach hinzufügen

public void actionPerformed(ActionEvent event) {
    if (event.getSource()==textField){
        textButton.doClick();
    }
    else if (event.getSource()==textButton) {
        //do something
    }
}
2
Ian Lee

Ich weiß, dass dies nicht der beste Weg ist, aber klicken Sie mit der rechten Maustaste auf die entsprechende Schaltfläche, Ereignisse, Schlüssel und Schlüssel. Dies ist eine einfache Methode, reagiert jedoch auf jeden Schlüssel

0
Dev Singh

Ohne Rahmen funktioniert das für mich:

JTextField tf = new JTextField(20);
tf.addKeyListener(new KeyAdapter() {

  public void keyPressed(KeyEvent e) {
    if (e.getKeyCode()==KeyEvent.VK_ENTER){
       SwingUtilities.getWindowAncestor(e.getComponent()).dispose();
    }
  }
});
String[] options = {"Ok", "Cancel"};
int result = JOptionPane.showOptionDialog(
    null, tf, "Enter your message", 
    JOptionPane.OK_CANCEL_OPTION,
    JOptionPane.QUESTION_MESSAGE,
    null,
    options,0);

message = tf.getText();
0
Brian
 switch(KEYEVENT.getKeyCode()){
      case KeyEvent.VK_ENTER:
           // I was trying to use case 13 from the ascii table.
           //Krewn Generated method stub... 
           break;
 }
0
kpie