光标箭头后的类似工具提示的消息

Pao*_*o M 3 java user-interface swing tooltip

如何使用 Swing 和 Java 7 获取跟随箭头光标的小消息(具有恒定背景,如工具提示)?我的意思是,类似工具提示的消息不取决于光标当前所在的组件,而是始终跟随光标移动并与之“固定”的文本。

谢谢。

mKo*_*bel 5

  • AFAIK 这可以通过使用Swing TimerPropertyChangeListener来完成

  • 也许还有另一个通知程序,代码必须在某个时间段处理,小心使用E(vent) D(ispath) T(hread)

  • 需要使用SwingUtilities.convertXxxToolTip添加到JPanelJPanel其中包含,还有添加另一个JComponents

  • 例如

. 在此处输入图片说明

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToolTip;
import javax.swing.Timer;
import javax.swing.ToolTipManager;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;

public class DynamicToolTipTest {

    private JPanel panel = new MyPanel();
    private JFrame frame = new JFrame("DynamicToolTipTest");

    public DynamicToolTipTest() {
        ToolTipManager ttm = ToolTipManager.sharedInstance();
        ttm.setInitialDelay(200);
        ttm.setDismissDelay(10000);
        panel.setToolTipText("Text 1");
        final Timer timer = new Timer(50, new ActionListener() {
            private int id = 1;

            @Override
            public void actionPerformed(ActionEvent e) {
                ++id;
                panel.setToolTipText("Text " + id);
            }
        });
        timer.start();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(panel);
        frame.pack();
        frame.setLocation(150, 100);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new DynamicToolTipTest();
            }
        });
    }

    private static final class MyPanel extends JPanel {

        private static final long serialVersionUID = 1L;

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(300, 200);
        }

        @Override
        public JToolTip createToolTip() {
            final JToolTip tip = super.createToolTip();
            final PropertyChangeListener updater = new PropertyChangeListener() {
                @Override
                public void propertyChange(final PropertyChangeEvent e) {
                    if (e.getNewValue() != null) {
                        tip.setTipText((String) e.getNewValue());
                        tip.repaint();
                    }
                }
            };
            tip.addAncestorListener(new AncestorListener() {
                @Override
                public void ancestorAdded(AncestorEvent event) {
                    //start listening for tip text changes only after the tip 
                    //is displayed, i.e. the tip is added to the component hierarchy
                    MyPanel.this.addPropertyChangeListener(TOOL_TIP_TEXT_KEY, updater);
                }

                @Override
                public void ancestorRemoved(AncestorEvent event) {
                    //stop listening for tip text changes once the tip is no longer 
                    //displayed, i.e. the tip is removed from the component hierarchy
                    MyPanel.this.removePropertyChangeListener(TOOL_TIP_TEXT_KEY, updater);
                }

                @Override
                public void ancestorMoved(AncestorEvent event) {
                }
            });
            return tip;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)