将KeyListener添加到JToolTip

时间:2014-02-24 22:17:16

标签: java swing

我有一些代码可以在用户操作后在屏幕上生成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);
  }
}

1 个答案:

答案 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