4

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

我使用 Netbeans 作为 IDE。我尝试添加 keyTyped 事件,但它不起作用。

这是我的代码

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

5 回答 5

4

实际上,您想要的是安装 KeyEventPostProcessor 的 KeyboardManager,甚至是各种组件的备用调度。我在 NB 应用程序中遇到了和你一样的问题。

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

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

    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;
    }
}
于 2010-12-14T19:48:33.493 回答
3

不要忘记调用setFocusable(true),如如何编写关键侦听器中所述。

于 2010-05-13T14:12:12.657 回答
2

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

于 2010-05-13T07:15:30.363 回答
2

添加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);并且自然应该将此组件添加到您的框架(或其他父组件)中。

于 2010-05-13T07:21:10.630 回答
0

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

于 2010-05-13T07:39:20.040 回答