请参阅我的示例代码。
JPopupMenu popUp = new JPopupMenu();
popUp.add(new JMenuItem("sample1"));
popUp.add(new JMenuItem("sample2"));
popUp.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
System.out.println("yy");
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("yy");
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("yy");
}
});
popUp.setVisible(true);
popUp.show(textPane, 0, 0);
popUp.requestFocus();
当使用JTextArea
作为弹出窗口的父组件时,相同的代码不起作用。我的逻辑是在弹出窗口上添加焦点,然后使用它的按键甚至重新填充弹出窗口。
我真的不确定你想做什么。你不需要在弹出窗口中添加KeyListener。弹出菜单将支持从一个项目移动到另一个项目。
阅读Swing教程中关于弹出菜单的部分,了解更多信息和示例。
使用它的按键,甚至可以重新填充弹出窗口。
在弹出窗口可见之前,您应该设置弹出窗口的项目。
从JTextPane向JPopupMenu添加键侦听器有效,但从JTextArea 不起作用
然后发布一个SSCCE,演示工作代码和非工作代码。如果我们了解您正在尝试做什么,那么我们可能能够为这两个组件提供更好的替代方案。
以下内容适用于我。你能详细说明弹出逻辑的重新填充吗?
JPopupMenu popUp = new JPopupMenu();
popUp.add(new JMenuItem("sample1"));
popUp.add(new JMenuItem("sample2"));
popUp.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
System.out.println("yy");
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("yy");
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("yy");
}
});
JFrame f = new JFrame();
JTextArea txtArea = new JTextArea();
f.add(txtArea);
f.setSize(300, 150);
f.setLocationRelativeTo(null);
f.setVisible(true);
popUp.setVisible(true);
popUp.show(txtArea, 0, 0);
popUp.requestFocus();