Java Swing нажмите правую кнопку, когда я наберу цифровую клавишу - PullRequest
0 голосов
/ 06 ноября 2018

Я пишу код, используя Java Swing, чтобы нажимать правую кнопку, когда я набираю цифровую клавишу. Но я не могу найти то, что я хочу через поиск. Это мой код, и я не могу понять, почему это не работает. Пожалуйста, помогите мне ..

import javax.swing.*;
import java.awt.Dimension;
import java.awt.event.*;

class class01 {

    public static void main(String[] args) {

        JFrame f = new JFrame("Key event test"); 
        f.setSize(230, 500);
        f.setLayout(null);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JLabel label = new JLabel(); 

        JButton button1 = new JButton("Coffe"); 
        button1.setSize(100, 100);
        button1.setLocation(0, 0);

        JButton button2 = new JButton("Latte");
        button2.setSize(100, 100);
        button2.setLocation(0, 100);

        JButton button3 = new JButton("Espresso");
        button3.setSize(100, 100);
        button3.setLocation(100, 100);

        JButton button4 = new JButton("Vanilla Latte");
        button4.setSize(100, 100);
        button4.setLocation(100, 0);

        f.add(button1); 
        f.add(button2);
        f.add(button3);
        f.add(button4);

        // Show message when the corresponding button is pressed.
        button1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                button1.keyPressed(KeyEvent.VK_1);
                JOptionPane.showMessageDialog(f.getComponent(0), "Coffee selected");
            }
        });
        button2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                button2.keyPressed(KeyEvent.VK_2);
                JOptionPane.showMessageDialog(f.getComponent(0), "Latte selected");
            }
        });
        button3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                button3.keyPressed(KeyEvent.VK_3);
                JOptionPane.showMessageDialog(f.getComponent(0), "Espresso selected");
            }
        });
        button4.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                button4.keyPressed(KeyEvent.VK_4);
                JOptionPane.showMessageDialog(f.getComponent(0), "Vanilla Latte selected");
            }
        });
    }
}

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

Код, который вы показываете, делает только одно: прикрепите слушатели действий к вашим кнопкам.

Значение: когда вы нажимаете кнопку, вызывается слушатель.

Вам необходим универсальный прослушиватель клавиатуры, который преобразует ключевые события в вызовы соответствующей кнопки, соответственно вместо слушателя действия.

0 голосов
/ 07 ноября 2018

Из того, что я понимаю, по сути, вы хотите, чтобы та же самая операция кнопки была назначена определенной клавише.

То, чего вы хотите избежать, это KeyListener, особенно потому, что у вас есть другие фокусируемые компоненты в виде, а именно кнопки, которые украдут фокус клавиатуры и сделают KeyListener бесполезным. Вот почему почти во всех случаях вы хотите избежать KeyListener.

Лучшим и более надежным решением было бы использование API связывания клавиш , которое преодолевает эту проблему, связанную с фокусом, но также поощряет использование повторно используемых компонентов работы через Action API s

Что-то вроде ...

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.StringJoiner;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.KeyStroke;

public class Test {

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

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            JTextField field = new JTextField(10);
            field.setEditable(false);
            field.setFocusable(false);

            InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
            ActionMap am = getActionMap();

            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_1, 0), "Pressed.One");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_2, 0), "Pressed.Two");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_3, 0), "Pressed.Three");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_4, 0), "Pressed.Four");

            am.put("Pressed.One", new OrderAction(1, field));
            am.put("Pressed.Two", new OrderAction(2, field));
            am.put("Pressed.Three", new OrderAction(3, field));
            am.put("Pressed.Four", new OrderAction(4, field));

            JButton btnOne = new JButton(new OrderAction(1, field));
            JButton btnTwo = new JButton(new OrderAction(2, field));
            JButton btnThree = new JButton(new OrderAction(3, field));
            JButton btnFour = new JButton(new OrderAction(4, field));

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();

            gbc.weightx = 1;
            gbc.weighty = 1;
            gbc.fill = GridBagConstraints.BOTH;
            gbc.gridx = 0;
            gbc.gridy = 1;
            add(btnOne, gbc);
            gbc.gridx++;
            add(btnTwo, gbc);
            gbc.gridx = 0;
            gbc.gridy++;
            add(btnThree, gbc);
            gbc.gridx++;
            add(btnFour, gbc);

            gbc.gridx = 0;
            gbc.gridy = 0;

            gbc.gridwidth = 2;
            add(field, gbc);
        }

        protected class OrderAction extends AbstractAction {

            private int value;
            private JTextField field;

            public OrderAction(int value, JTextField field) {
                this.value = value;
                this.field = field;
                switch (value) {
                    case 1:
                        putValue(NAME, "Coffe");
                        break;
                    case 2:
                        putValue(NAME, "Latte");
                        break;
                    case 3:
                        putValue(NAME, "Espresso");
                        break;
                    case 4:
                        putValue(NAME, "Vanilla Latte");
                        break;
                }
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                StringJoiner sj = new StringJoiner("; ");
                if (field.getText() != null && field.getText().length() > 0) {
                    sj.add(field.getText());
                }
                sj.add(Integer.toString(value));
                field.setText(sj.toString());
            }

        }

    }

}

Обратите внимание, что вместо этого вы можете применять привязки клавиш непосредственно к каждой кнопке

Теперь, если вы хотите «визуально» нажать кнопку при нажатии клавиши, я бы порекомендовал либо создать пользовательский JButton, либо заводской метод, который мог бы обеспечить более упрощенную реализацию, но основная идея заключалась бы в следующем: определите привязку ключа и Action, который просто вызывается методом кнопок doClick, например

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.StringJoiner;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.KeyStroke;

public class Test {

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

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            JTextField field = new JTextField(10);
            field.setEditable(false);
            field.setFocusable(false);

            JButton btnOne = new JButton(new OrderAction(1, field));
            JButton btnTwo = new JButton(new OrderAction(2, field));
            JButton btnThree = new JButton(new OrderAction(3, field));
            JButton btnFour = new JButton(new OrderAction(4, field));

            InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
            ActionMap am = getActionMap();

            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_1, 0), "Pressed.One");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_2, 0), "Pressed.Two");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_3, 0), "Pressed.Three");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_4, 0), "Pressed.Four");

            am.put("Pressed.One", new ProxyAction(btnOne));
            am.put("Pressed.Two", new ProxyAction(btnTwo));
            am.put("Pressed.Three", new ProxyAction(btnThree));
            am.put("Pressed.Four", new ProxyAction(btnFour));

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();

            gbc.weightx = 1;
            gbc.weighty = 1;
            gbc.fill = GridBagConstraints.BOTH;
            gbc.gridx = 0;
            gbc.gridy = 1;
            add(btnOne, gbc);
            gbc.gridx++;
            add(btnTwo, gbc);
            gbc.gridx = 0;
            gbc.gridy++;
            add(btnThree, gbc);
            gbc.gridx++;
            add(btnFour, gbc);

            gbc.gridx = 0;
            gbc.gridy = 0;

            gbc.gridwidth = 2;
            add(field, gbc);
        }

        protected class ProxyAction extends AbstractAction {

            private JButton btn;

            public ProxyAction(JButton btn) {
                this.btn = btn;
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                btn.doClick();
            }

        }

        protected class OrderAction extends AbstractAction {

            private int value;
            private JTextField field;

            public OrderAction(int value, JTextField field) {
                this.value = value;
                this.field = field;
                switch (value) {
                    case 1:
                        putValue(NAME, "Coffe");
                        break;
                    case 2:
                        putValue(NAME, "Latte");
                        break;
                    case 3:
                        putValue(NAME, "Espresso");
                        break;
                    case 4:
                        putValue(NAME, "Vanilla Latte");
                        break;
                }
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                StringJoiner sj = new StringJoiner("; ");
                if (field.getText() != null && field.getText().length() > 0) {
                    sj.add(field.getText());
                }
                sj.add(Integer.toString(value));
                field.setText(sj.toString());
            }

        }

    }

}
0 голосов
/ 06 ноября 2018

Когда вы делаете это:

button1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            button1.keyPressed(KeyEvent.VK_1);
            JOptionPane.showMessageDialog(f.getComponent(0), "Coffee selected");
        }
    });

Вы говорите button1, что делать, когда кто-то нажимает на кнопку. Строка с keyPressed не должна быть там (она даже не компилируется).

Что вам нужно сделать, это прослушать нажатие клавиш, добавив KeyListener к кадру следующим образом:

f.addKeyListener(new KeyAdapter() {
        @Override
        public void keyTyped(KeyEvent e) {
            if( e.getKeyChar() == KeyEvent.VK_1) {
                JOptionPane.showMessageDialog(f.getComponent(0), "Coffee selected");
            }
        }
    });

Я повторил showMessageDialog, но вы должны извлечь действительную логику в метод и вызвать этот метод из KeyListener в кадре и ActionListener в кнопке.

...