代码之家  ›  专栏  ›  技术社区  ›  rgksugan

用Java捕获面板中的击键

  •  4
  • rgksugan  · 技术社区  · 15 年前

    我想捕获Java中的面板上的焦点时的击键。我该怎么办?

    我使用NetBeans作为IDE。我试图添加键类型事件,但它不起作用。

    这是我的密码

    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;
    }
    
    5 回复  |  直到 14 年前
        1
  •  2
  •   Finbarr    15 年前

    您需要在面板中添加一个新的FocusListener和一个新的KeyListener。如果只希望在面板处于焦点时捕获击键,请获取FocusListener的操作以添加并删除该键监听器。

        2
  •  4
  •   Daver    14 年前

    实际上,您需要的是一个keyboardmanager来安装keyEventPostProcessor,甚至是各种组件的备用调度。我和你在NB应用程序中有同样的问题。

    这是我用过的文章:( developer.com )

    我这样做是为了从面板中的任何控件捕获Enter键事件(自动启动“确定”按钮行为):

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

    听众:

        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;
        }
    }
    
        3
  •  3
  •   trashgod    15 年前
        4
  •  2
  •   MiKo    15 年前

    添加 KeyListener 你的小组:

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

    用相应的方法处理事件。

    正如其他人所说,你必须 panel.setFocusable(true); 当然,您应该将这个组件添加到您的框架(或其他父组件)中。

        5
  •  0
  •   fish    15 年前

    根据你想要达到的目标,你也可以在这里找到帮助: http://java.sun.com/products/jfc/tsc/special_report/kestrel/keybindings.html