我正在使用Java Swing GUI,并且弹出菜单项上的工具提示文本存在一个小问题。

基本上,当您将鼠标悬停在JMenuItem上时,应该使该JMenuItem保持选中状态并显示所需的工具提示文本。

实际发生的是,当使工具提示文本可见时,StateChange事件似乎导致相关的JMenuItem失去选择状态,因此工具提示文本很快消失了。请注意,这仅在第一次时发生,如果将鼠标移至四处,可以再次选择JMenuItem,它还将正确显示工具提示文本。我可以离开这个,但是我希望通过ToolTipManager的sharedInstance()设置一个延迟,这会损害用户友好的一面,因为用户自己意识到问题后将不得不等待两倍的时间。

我构建了一个非常简单的演示程序,该演示程序反映了我所看到的问题,是否缺少某些东西?或者这仅仅是Java 8和Mac的问题?

import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class TestFrame {

    static JFrame jf = new JFrame();

    public static void main(String[] args){
      jf = new JFrame();

      JPanel jp = new JPanel();
      jp.setBackground(Color.white);
      jp.setForeground(Color.black);

      JPopupMenu p = new JPopupMenu();

      JMenuItem jmi = new JMenuItem("An option");
      jmi.setToolTipText("mouse over text");
      jmi.addChangeListener(new ChangeListener(){
        @Override
        public void stateChanged(ChangeEvent e) {
            System.out.println("CHANGED by: "+e.getSource().toString());
        }});

      p.add(jmi);

      jp.setComponentPopupMenu(p);

      jf.add(jp);
      jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      jf.setSize(1000, 500);
      jf.setPreferredSize(jf.getSize());
      jf.setVisible(true);
    }
}

最佳答案

作为参考,我尝试了在event dispatch thread上运行的此修改版本。它似乎有所改进,但仍会间歇性地失败。看起来像是回归。

安慰:

$ javac TestFrame.java ; java TestFrame
1.8.0_31
10.9.5
…

Code:

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.event.ChangeEvent;

/** @see http://stackoverflow.com/a/28160300/230513 */
public class TestFrame {

    public static void main(String[] args) {
        System.out.println(System.getProperty("java.version"));
        System.out.println(System.getProperty("os.version"));
        EventQueue.invokeLater(() -> {
            JFrame jf = new JFrame();
            JPanel jp = new JPanel();
            JPopupMenu p = new JPopupMenu();
            JMenuItem jmi = new JMenuItem("An option");
            jmi.setToolTipText("Mouse over text");
            jmi.addChangeListener((ChangeEvent e) -> {
                System.out.println("Changed by: " + e.getSource().toString());
            });
            p.add(jmi);
            jp.setComponentPopupMenu(p);
            jf.add(jp);
            jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            jf.pack();
            jf.setSize(320, 240);
            jf.setVisible(true);
        });
    }
}

关于java - tooltipText错误导致JMenuItem失去焦点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28159410/

10-09 10:01