我有一些代码可以在用户操作后在屏幕上生成JToolTip。我希望用户能够通过点击或按键来解除提示(ESC,比方说)。我可以让鼠标部分工作,但我无法弄清楚如何/在哪里捕捉关键事件。我怀疑这与焦点有关,但我所有的随机刺都没有结果。这是一个简短的代码示例,显示了我正在尝试的内容:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
public class HelloSwing extends JFrame {
HelloSwing() {
JPanel panel = new JPanel();
JButton button = new JButton("Hello!");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final JWindow window = new JWindow();
JToolTip tip = new JToolTip();
tip.setTipText("Here's a tip...");
tip.setVisible(true);
window.getContentPane().add(tip);
window.pack();
window.setLocation(50, 50);
window.setAlwaysOnTop(true);
window.setVisible(true);
// This works:
window.getRootPane().addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
window.setVisible(false);
}
});
// This does not work:
window.getRootPane().addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
System.out.println("key pressed!");
window.setVisible(false);
}
});
}
});
panel.add(button);
add(panel);
}
public static void main(String[] args) {
HelloSwing hello = new HelloSwing();
hello.setTitle("Title!");
hello.setSize(300, 200);
hello.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
hello.setVisible(true);
}
}
答案 0 :(得分:3)
为了使关键监听器工作,组件必须是可聚焦的并具有焦点。密钥监听器是一个较低级别的接口。最好使用Key Bindings。有关详细信息和示例,请参阅How to Use Key Bindings。例如,尝试以下方法:
getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, false), "ESCAPE");
getRootPane().getActionMap().put("ESCAPE", new AbstractAction() {
public void actionPerformed(ActionEvent e) {
window.setVisible(false);
}
});
请注意ToolTipManager已注册VK_ESCAPE
以隐藏工具提示,正常情况下,escape会按预期工作。
另请注意,在这种情况下无需使用JToolTip
,因为您正在使用JWindow
手动显示它。它可以只是JLabel
。
有关常用工具提示使用的一些示例,请参阅How to Use Tool Tips。