2015-01-26 71 views
1

我正在使用Java Swing GUI,并且弹出菜单项上的工具提示文本存在小问题。tooltipText错误导致JMenuItem失去焦点

基本上,当鼠标悬停在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); 
    } 
} 

回答

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); 
     }); 
    } 
} 
+0

谢谢,是啊,让我的机器上同样的结果。猜猜它提交bug报告的时间? – Tdiddy 2015-01-27 00:28:53

+1

@trashgod [我找到一个有趣的例子](http://www.coderanch.com/t/645179/GUI/java/fireTableDataChanged-working) – mKorbel 2015-01-27 06:30:19