Capturing keystrokes in a panel in java

I want to capture keystrokes when you focus on a panel in java. What should I do?

I use Netbeans as an IDE. I tried to add a keyTyped event, but it does not work.

Here is my code

import com.lanadmin.Interface.ClientInterface; import java.awt.Toolkit; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.rmi.Naming; import java.util.logging.Level; public class RemoteViewer extends javax.swing.JInternalFrame { public RemoteViewer() { initComponents(); rdpanel.setFocusable(true); } @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { rdpanel = new javax.swing.JPanel(); setFocusable(true); rdpanel.setToolTipText("Remote Desktop"); rdpanel.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { rdpanelMouseClicked(evt); } public void mousePressed(java.awt.event.MouseEvent evt) { rdpanelMousePressed(evt); } public void mouseReleased(java.awt.event.MouseEvent evt) { rdpanelMouseReleased(evt); } }); rdpanel.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { public void mouseMoved(java.awt.event.MouseEvent evt) { rdpanelMouseMoved(evt); } }); rdpanel.addFocusListener(new java.awt.event.FocusAdapter() { public void focusGained(java.awt.event.FocusEvent evt) { rdpanelFocusGained(evt); } }); rdpanel.addKeyListener(new java.awt.event.KeyAdapter() { public void keyPressed(java.awt.event.KeyEvent evt) { rdpanelKeyPressed(evt); } public void keyReleased(java.awt.event.KeyEvent evt) { rdpanelKeyReleased(evt); } public void keyTyped(java.awt.event.KeyEvent evt) { rdpanelKeyTyped(evt); } }); javax.swing.GroupLayout rdpanelLayout = new javax.swing.GroupLayout(rdpanel); rdpanel.setLayout(rdpanelLayout); rdpanelLayout.setHorizontalGroup( rdpanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 679, Short.MAX_VALUE) ); rdpanelLayout.setVerticalGroup( rdpanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 626, Short.MAX_VALUE) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(rdpanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(rdpanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addContainerGap()) ); pack(); }// </editor-fold> private void rdpanelMouseMoved(java.awt.event.MouseEvent evt) { double xScale = Toolkit.getDefaultToolkit().getScreenSize().getWidth() / rdpanel.getWidth(); double yScale = Toolkit.getDefaultToolkit().getScreenSize().getHeight() / rdpanel.getHeight(); try { String current = Login.handler.currentClientAddress.getHostAddress(); ClientInterface client = (ClientInterface) Naming.lookup("rmi://" + current + "/lan"); client.mousemove((int) (evt.getX() * xScale), (int) (evt.getY() * yScale)); } catch (Exception ex) { Log2File.logger.log(Level.SEVERE, null, ex); Log2File.fileHandler.flush(); } } private void rdpanelKeyPressed(java.awt.event.KeyEvent evt) { System.out.println("keypressed"); } private void rdpanelKeyTyped(java.awt.event.KeyEvent evt) { System.out.println("aaa"); } private void rdpanelKeyReleased(java.awt.event.KeyEvent evt) { System.out.println("keyreleased"); } private void rdpanelFocusGained(java.awt.event.FocusEvent evt) { rdpanel.addKeyListener(new java.awt.event.KeyAdapter() { @Override public void keyPressed(java.awt.event.KeyEvent evt) { rdpanelKeyPressed(evt); } @Override public void keyReleased(java.awt.event.KeyEvent evt) { rdpanelKeyReleased(evt); } @Override public void keyTyped(java.awt.event.KeyEvent evt) { rdpanelKeyTyped(evt); } }); } public javax.swing.JPanel rdpanel; } 
+4
source share
5 answers

You need to add a new FocusListener and a new KeyListener to the panel. If you want the keystrokes to be captured when the panel is in focus, get the FocusListener action to add the KeyListener and remove it.

+2
source

In fact, you want the KeyboardManager to set the KeyEventPostProcessor or even an alternative dispatch for various components. I had the same problems in the NB app like you.

In this article, I used: ( developer.com )

I did this to capture key input events from any control in the panel (to trigger the OK button behavior automatically):

  KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); manager.addKeyEventPostProcessor(new EnterKeyListener()); 

And the listener:

  class EnterKeyListener implements KeyEventPostProcessor { @Override public boolean postProcessKeyEvent(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { //Activate the refresh button: fireSearch(); return true; //halt further processing } return false; } } 
+4
source

Remember to call setFocusable(true) as described in How to Write a Key Listener .

+3
source

Add KeyListener to the panel:

 JPanel panel = new JPanel(); panel.addKeyListener(new KeyListener() { public void keyTyped(KeyEvent e) { … } public void keyReleased(KeyEvent e) { … } public void keyPressed(KeyEvent e) { … } }); 

Handle the event using the appropriate method.

As pointed out in others, you need to set panel.setFocusable(true); and, of course, you should add this component to your frame (or another parent component).

+2
source

Depending on what you want to achieve, you can also find help here: http://java.sun.com/products/jfc/tsc/special_report/kestrel/keybindings.html

0
source

Source: https://habr.com/ru/post/1309629/


All Articles