2015-01-26 3 views
1

Java Swing GUI에서 작업 중이며 팝업 메뉴 항목의 툴팁 텍스트에 사소한 문제가 있습니다. 당신이 JMenuItem를 위에 마우스를 올려 때tooltipText 버그로 인해 JMenuItem이 포커스를 잃게됩니다.

은 기본적으로는 JMenuItem를 선택한 것을두고 원하는 도구 설명 텍스트를 표시하기로한다. 툴팁 텍스트가 STATECHANGE 이벤트가 선택 상태 등 도구 설명 텍스트 매우 빠르게 사라를 잃고 관련 JMenuItem를을 일으킬 것으로 보인다 표시되었을 때에 실제로 어떻게됩니까

이다. 이 작업은 처음에만 발생합니다. 마우스를 움직이면 JMenuItem을 다시 선택할 수 있으며 도구 팁 텍스트도 제대로 표시됩니다. 나는 이것을 남겨 둘 수 있었지만 ToolTipManager의 sharedInstance()를 통해 지연을 설정하기를 희망했다.이 시점에서 사용자는 문제를 실현 한 후 사용자가 두 번 오래 기다려야하기 때문에 사물의 사용자 친화적 측면을 해칠 수있다.

제가보고있는 문제를 반영하는 매우 간단한 데모를 만들었습니까? 제가 놓친 것이 있습니까? 아니면 그냥 Mac 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

덕분에, 그래 그건 내 시스템에서 동일한 결과를 제공합니다. 버그 리포트를 제출할 시간은 언제입니까? – Tdiddy

+1

@trashgod [흥미로운 예제를 찾았습니다] (http://www.coderanch.com/t/645179/GUI/java/fireTableDataChanged-working) – mKorbel

관련 문제