我想在 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;
}
最佳答案
实际上,您想要的是一个 KeyboardManager 来安装 KeyEventPostProcessor,或者甚至是各种组件的替代调度。我在 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;
}
}
关于java - 在java中捕获面板中的击键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2824982/