Щелчок JButton с клавиатуры с помощью KeyListener - PullRequest
1 голос
/ 13 июля 2020

Как я описал в заголовке, я должен щелкнуть JButton, если нажата клавиша с клавиатуры. Например:

ActionListenerClass actionListener = new ActionListenerClass();
KeyListenerClass actionListener = new KeyListenerClass();
JButton aButton = new JButton("A");
aButton.setActionCommand("A");
aButton.addActionListener(actionListener);
aButton.addKeyListener(keyListener);

При нажатии «A» на клавиатуре кнопка A выполнит doClick () и отправит команду действия частному классу прослушивателя действий для обработки событий. Теперь я прочитал много решений о переполнении стека, и все они использовали привязку клавиш, которая должна связывать входную карту и карту действий. Дело в том, что мне абсолютно необходимо использовать прослушиватель ключей с частным классом, но не с привязкой. Единственное, о чем я могу догадаться, так это то, что приведенный выше keyListener должен каким-то образом получить ввод с клавиатуры и выполнить doClick на кнопке, к которой он привязан, в методе keyPressed, который я попробовал, но он вообще не работал.

Редактировать: вот мой весь код.

  1. CalculatorViewController. java



import java.awt.*;
import java.awt.event.*;
import java.util.regex.Pattern;

import javax.swing.*;
/**Create the app GUI
 * @author Bach Le
 * @version 1.0
 * @see java.awt, java.awt.event, javax.swing
 * @since 12.0.1
 */
public class CalculatorViewController extends JPanel   {

    
    private JButton backSpaceButton;
     public CalculatorViewController() {
    Controller controller = new Controller();
    KeyController keyController  = new KeyController();

    
    
    setBorder(BorderFactory.createMatteBorder(5, 5, 5, 5,Color.black));//Adding the panel border
    
    
     backSpaceButton = new JButton("\u21DA");

    backSpaceButton.setPreferredSize(new Dimension(52,55));
    backSpaceButton.setOpaque(false);//set transparency
    backSpaceButton.setContentAreaFilled(false);
    backSpaceButton.setBorderPainted(false);
    backSpaceButton.setActionCommand("Backspace Button");//set the action command
    backSpaceButton.addActionListener(controller);//add action listener
    backSpaceButton.setToolTipText("Backspace (Alt+B)");//set tooltip text
    backSpaceButton.setFont(font);//set the font
    backSpaceButton.addKeyListener(keyController);
   
   add(backSpaceButton) ;
   
 
   



}
    


private class Controller implements ActionListener{
public void actionPerformed(ActionEvent e) {
//event handling here
}
}

private class KeyController implements KeyListener{

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub
    
    }

    @Override
    public void keyPressed(KeyEvent e) {
    if(e.getKeyCode()==65) {
        backSpaceButton.doClick();
        
    }
        
    }

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

}

2. Калькулятор. java

public class Calculator {
    public static void main(String[] args) {
          CalculatorViewController pane = new CalculatorViewController();
            
             JFrame frame = new JFrame("Calculator");
           frame.setContentPane(pane);  
            frame.setSize(380, 520);
            frame.setLocationByPlatform(true);
            frame.setResizable(true);
            frame.setVisible(true);
       }

}

Сосредоточьтесь на CalculatorViewController, я пытаюсь заставить backSpaceButton щелкнуть при нажатии A (конечно, это настоящая кнопка возврата, но я исправлю ее позже), поэтому он отправит свою команду действия зарегистрированному для него прослушивателю действия, который будет обрабатываться в методе внутреннего класса Controller. Я не уверен, как это сделать.

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

Добавление KeyListener будет работать только для компонентов с фокусом. Вы не хотели бы добавлять KeyListener к JButtons, потому что только один JButton будет в фокусе.

Для простой установки значения вы можете использовать setMnemoni c, но тогда у вас будет использовать модификатор (например, 'alt) при нажатии клавиши.

«Правильный» способ сделать это - использовать привязки клавиш

Вот пример с двумя кнопками.

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

public class ButtonKeys{
    
    public void buildGui(){
        JFrame frame = new JFrame("key buttons");
        JPanel panel = new JPanel(new BorderLayout());
        JButton a = new JButton("A");
        a.addActionListener(evt->{ System.out.println("a pressed");});
        JButton b = new JButton("B");
        b.addActionListener(evt->{ System.out.println("b pressed");});
        
        panel.add(a, BorderLayout.EAST);
        panel.add(b, BorderLayout.WEST);
        
        frame.setContentPane(panel);
        frame.setVisible(true);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        KeyStroke us = KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, false);
        panel.getInputMap().put(us, "A");
        panel.getActionMap().put("A", new AbstractAction(){
            @Override
            public void actionPerformed(ActionEvent evt){
               a.doClick();
            }
        });
        
        KeyStroke us2 = KeyStroke.getKeyStroke(KeyEvent.VK_B, 0, false);
        panel.getInputMap().put(us2, "B");
        panel.getActionMap().put("B", new AbstractAction(){
            @Override
            public void actionPerformed(ActionEvent evt){
               b.doClick();
            }
        });
        a.setFocusable(false);
        b.setFocusable(false);

    }

    public static void main(String[] args){
        EventQueue.invokeLater( new ButtonKeys()::buildGui);
    }
}

Я сделал кнопки так, чтобы они не получали фокус, потому что, если они получат фокус, будет использоваться их карта ввода.

1 голос
/ 13 июля 2020

Этот код должен работать на вас. Для KeyListener я использовал KeyAdapter , здесь , так как это более удобно, если вам просто нужно использовать один из методов. Вы, конечно, можете переместить слушателей в отдельные классы, если это необходимо, но поведение останется прежним.

public static void main(String[] args) {

    JFrame frame = new JFrame();
    JPanel panel = new JPanel();
    
    JButton btn = new JButton("A");
    btn.addActionListener(new ActionListener() {
        
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("Button clicked");
        }
    });
    btn.addKeyListener(new KeyAdapter() {
        public void keyTyped(KeyEvent e) {
            if (e.getKeyChar() == 'A' || e.getKeyChar() == 'a') {
                ((JButton) e.getSource()).doClick();
            }
        }
    });
    panel.add(btn);
    
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(0, 0, 800, 600);
    frame.getContentPane().add(panel);
    frame.setVisible(true);
}

Если вам действительно нужно использовать KeyListener, это будет выглядеть так:

    btn.addKeyListener(new KeyListener() {
        
        @Override
        public void keyTyped(KeyEvent e) {
            if (e.getKeyChar() == 'A' || e.getKeyChar() == 'a') {
                ((JButton) e.getSource()).doClick();
            }
        }
        
        @Override
        public void keyReleased(KeyEvent e) {
            // TODO Auto-generated method stub
            
        }
        
        @Override
        public void keyPressed(KeyEvent e) {
            // TODO Auto-generated method stub
            
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...