我正在使用Java Swing GUI,并且在弹出菜单项上有一个小工具提示文字问题。
基本上当您将鼠标悬停在 JMenuItem 上时,应该选择 JMenuItem 并显示所需的工具提示文字。
实际发生的情况是,当工具提示文本可见时, StateChange 事件似乎导致相关的 JMenuItem 失去选择状态,因此工具提示文本很快消失。请注意,这仅在第一次发生时,如果您移动鼠标,则可以再次选择 JMenuItem ,它还将正确显示工具提示文本。我可以离开这个,但我希望通过ToolTipManager的sharedInstance()设置一个延迟,这在这一点上会伤害用户友好的一面,因为用户在自己意识到问题后必须等待两倍。
我构建了一个非常简单的演示,它反映了我看到的问题,我错过了什么,或者这只是一个带Mac问题的Java 8?
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);
}
}
答案 0 :(得分:1)
作为参考,我尝试了在event dispatch thread上运行的这个修改版本。它的似乎得到了改进,但它仍然间歇性地失败。它看起来像一个回归。
控制台:
$ javac TestFrame.java ; java TestFrame 1.8.0_31 10.9.5 …
代码:
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);
});
}
}