在java中捕获面板中的击键

在java中捕获面板中的击键,java,swing,keyboard-events,Java,Swing,Keyboard Events,我想在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.ut

我想在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;
}
import com.lanadmin.Interface.ClientInterface;
导入java.awt.Toolkit;
导入java.awt.event.InputEvent;
导入java.awt.event.MouseEvent;
导入java.rmi.Naming;
导入java.util.logging.Level;
公共类RemoteViewer扩展了javax.swing.JInternalFrame{
公共RemoteViewer(){
初始化组件();
rdpanel.setFocusable(真);
}
@抑制警告(“未选中”)
//                           
私有组件(){
rdpanel=newjavax.swing.JPanel();
设置聚焦(真);
setToolTipText(“远程桌面”);
addMouseListener(新java.awt.event.MouseAdapter(){
public void mouseClicked(java.awt.event.MouseEvent evt){
RDT(evt);
}
public void mousePressed(java.awt.event.MouseEvent evt){
rdpanelMousePressed(evt);
}
public void mouseereleased(java.awt.event.MouseEvent evt){
RDT(evt);
}
});
rdpanel.addMouseMotionListener(新java.awt.event.MouseMotionAdapter(){
public void mouseMoved(java.awt.event.MouseEvent evt){
rdpanelMouseMoved(evt);
}
});
addFocusListener(新的java.awt.event.FocusAdapter(){
public void focusgoven(java.awt.event.FocusEvent evt){
RDT(evt);
}
});
addKeyListener(新的java.awt.event.KeyAdapter(){
按下public void键(java.awt.event.KeyEvent evt){
RDPanel按键(evt);
}
public void keyReleased(java.awt.event.KeyEvent evt){
RDT(evt);
}
public void keyTyped(java.awt.event.KeyEvent evt){
RDT(evt);
}
});
javax.swing.GroupLayout rdpanelLayout=新的javax.swing.GroupLayout(rdpanel);
rdpanel.setLayout(rdpanelLayout);
rdpanelLayout.setHorizontalGroup(
createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0,679,短。最大值)
);
rdpanelLayout.setVerticalGroup(
createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0,626,短。最大值)
);
javax.swing.GroupLayout=newjavax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(布局);
layout.setHorizontalGroup(
createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(rdpanel,javax.swing.GroupLayout.DEFAULT\u SIZE,javax.swing.GroupLayout.DEFAULT\u SIZE,Short.MAX\u值)
.addContainerGap())
);
layout.setVerticalGroup(
createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(rdpanel,javax.swing.GroupLayout.DEFAULT\u SIZE,javax.swing.GroupLayout.DEFAULT\u SIZE,Short.MAX\u值)
.addContainerGap())
);
包装();
}//                         
私有void rdpanelMouseMoved(java.awt.event.MouseEvent evt){
double xScale=Toolkit.getDefaultToolkit().getScreenSize().getWidth()/rdpanel.getWidth();
double yScale=Toolkit.getDefaultToolkit().getScreenSize().getHeight()/rdpanel.getHeight();
试一试{
字符串current=Login.handler.currentClientAddress.getHostAddress();
ClientInterface client=(ClientInterface)Naming.lookup(“rmi://“+current+”/lan”);
mousemove((int)(evt.getX()*xScale),(int)(evt.getY()*yScale));
}捕获(例外情况除外){
Log2File.logger.log(Level.SEVERE,null,ex);
Log2File.fileHandler.flush();
}
}                                  
private void rdpanelKeyPressed(java.awt.event.KeyEvent evt){
System.out.println(“按键”);
}                                  
私有void rdpanelKeyTyped(java.awt.event.KeyEvent evt){
系统输出打印项次(“aaa”);
}                                
私有void rdpanelKeyReleased(java.awt.event.KeyEvent evt){
System.out.println(“按键释放”);
}                                   
私有void rdpanelfocusgovered(java.awt.event.FocusEvent evt){
addKeyListener(新的java.awt.event.KeyAdapter(){
@凌驾
按下public void键(java.awt.event.KeyEvent evt){
RDPanel按键(evt);
}
@凌驾
public void keyReleased(java.awt.event.KeyEvent evt){
RDT(evt);
}
@凌驾
public void keyTyped(java.awt.event.KeyEvent evt){
RDT(evt);
}
});
}                                   
public javax.swing.JPanel rdpanel;
}

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

向面板添加
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
    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;
    }
}