2012-05-01 4 views
1

고객은 UI에 문제가 있다고합니다. 때로는 그들이 팝업 메뉴를 열고 사라진 후에도 회색 영역이 사라지지 않았습니다. 우리는 팝업 장소 (JPopupMenu)에 표시된 스윙과 회색 사각형을 사용합니다.스윙 JPopupMenu : 회색 영역 겹침

Gray area

나는 그 문제를 재현 할 수 있습니다. 그것에 대해 읽을 수있는 곳은 어디입니까? 이와 직접 스윙 JComponent의 반대와 AWT PopupMenu를 혼합

+1

전혀 GUI의 모든 AWT 구성 요소가 있습니까 몰라? 모든 GUI 업데이트가 EDT에서 수행됩니까? –

+1

@AndrewThompson의 설명을 더욱 명확하게하기 위해 [메뉴 튜토리얼] (http://docs.oracle.com/javase/tutorial/uiswing/components/menu.html)에서 경량급/중량급 및 메뉴의 혼합이 다루어지고 [this ] (http://www.oracle.com/technetwork/articles/java/mixing-components-433992.html)도 흥미로운 기사 일 수 있습니다. – Robin

답변

1
  • 불가능이 이유가 무엇이든간에 그 반대로 스윙 AWT PopupMenu을 혼합하는 방법을 그리워 (aaaach 이유 AWT의 나머지 동일하지 구현이며 J 스윙/Component too)

  • out of EDT 여기에 게시 한 이미지와 아무런 관련이 없습니다. Popup과 JPopup이 모두 API의 MOUSE_RIGHT_CLICK에서 관련 메소드를 올바르게 구현했기 때문에 AWT PopupMenu 만 첫 번째 모니터에만 표시됩니다 2 번째 또는 3 번째 모니터에도 컨테이너를 배치 할 수 있습니다. AFAIK는 Swing JPopupMenu에만 고정됩니다

  • 30초 EDT false를 반환 한 후 예를 들어 EDT에있는 모든 이벤트 (들)가없는 경우

, J/팝업은 Java6_019에 대한 모든 경우에 작동하거나 스윙 경우 22

import java.awt.EventQueue; 
import java.awt.Frame; 
import java.awt.Label; 
import java.awt.MenuItem; 
import java.awt.PopupMenu; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.concurrent.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.*; 

public class IsThereEDT { 

    private ScheduledExecutorService scheduler; 
    private AccurateScheduledRunnable periodic; 
    private ScheduledFuture<?> periodicMonitor; 
    private int taskPeriod = 30; 
    private SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); 
    private Date dateRun; 
    private JFrame frame1 = new JFrame("Frame 1"); 
    private Frame frame2 = new Frame("Frame 2"); 
    private PopupMenu popup1 = new PopupMenu(); 

    public IsThereEDT() { 
     scheduler = Executors.newSingleThreadScheduledExecutor(); 
     periodic = new AccurateScheduledRunnable() { 

      private final int ALLOWED_TARDINESS = 200; 
      private int countRun = 0; 
      private int countCalled = 0; 
      private int maxCalled = 10; 

      @Override 
      public void run() { 
       countCalled++; 
       if (countCalled < maxCalled) { 
        if (countCalled % 3 == 0) { 
         /*if (EventQueue.isDispatchThread()) { 
         SwingUtilities.invokeLater(new Runnable() { 

         @Override 
         public void run() { 
         //some stuff 
         } 
         }); 
         } else { 
         try { 
         SwingUtilities.invokeAndWait(new Runnable() { 

         @Override 
         public void run() { 
         //some stuff 
         } 
         }); 
         } catch (InterruptedException ex) { 
         Logger.getLogger(IsThereEDT.class.getName()).log(Level.SEVERE, null, ex); 
         } catch (InvocationTargetException ex) { 
         Logger.getLogger(IsThereEDT.class.getName()).log(Level.SEVERE, null, ex); 
         } 
         }*/ 
         /*SwingUtilities.invokeLater(new Runnable() { 

         @Override 
         public void run() { 
         System.out.println("Push a new event to EDT"); 
         frame1.repaint(); 
         isThereReallyEDT(); 
         } 
         });*/ 
        } else { 
         if (this.getExecutionTime() < ALLOWED_TARDINESS) { 
          countRun++; 
          isThereReallyEDT(); // non on EDT 
         } 
        } 
       } else { 
        System.out.println("Terminating this madness"); 
        System.exit(0); 
       } 
      } 
     }; 
     periodicMonitor = scheduler.scheduleAtFixedRate(periodic, 0, taskPeriod, TimeUnit.SECONDS); 
     periodic.setThreadMonitor(periodicMonitor); 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       isThereReallyEDT(); 
       Label label1 = new Label("Hello in frame 1"); 

       for (int i = 1; i <= 5; i++) { 
        MenuItem menuItem = new MenuItem("item" + i); 
        popup1.add(menuItem); 
       } 
       label1.add(popup1); 
       frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame1.add(label1); 
       frame1.pack(); 
       frame1.setLocation(100, 100); 
       frame1.setVisible(true); 
      } 
     }); 
     try { 
      Thread.sleep(1500); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(IsThereEDT.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       //frame2.setDefaultCloseOperation(Frame.EXIT_ON_CLOSE); 
       JLabel label2 = new JLabel("Hello in frame 2"); 
       frame2.add(label2); 
       frame2.pack(); 
       frame2.setLocation(200, 200); 
       frame2.setVisible(true); 
       isThereReallyEDT(); 
      } 
     }); 
    } 

    private void isThereReallyEDT() { 
     dateRun = new java.util.Date(); 
     System.out.println("       Time at : " + sdf.format(dateRun)); 
     if (EventQueue.isDispatchThread()) { 
      System.out.println("EventQueue.isDispatchThread"); 
     } else { 
      System.out.println("There isn't Live EventQueue.isDispatchThread, why any reason for that "); 
     } 
     if (SwingUtilities.isEventDispatchThread()) { 
      System.out.println("SwingUtilities.isEventDispatchThread"); 
     } else { 
      System.out.println("There isn't Live SwingUtilities.isEventDispatchThread, why any reason for that "); 
     } 
     System.out.println(); 
    } 

    public static void main(String[] args) { 
     IsThereEDT isdt = new IsThereEDT(); 
    } 
} 

abstract class AccurateScheduledRunnable implements Runnable { 

    private ScheduledFuture<?> thisThreadsMonitor; 

    public void setThreadMonitor(ScheduledFuture<?> monitor) { 
     this.thisThreadsMonitor = monitor; 
    } 

    protected long getExecutionTime() { 
     long delay = -1 * thisThreadsMonitor.getDelay(TimeUnit.MILLISECONDS); 
     return delay; 
    } 
} 
  • JComponent의이 호출되고 EDT 중 볼이 최소 경계가 기본 OS에서 반환 반환하지만 JPopuMenu 컨테이너가 큰 영역을 반환 한 후

가) 코드가 JMenuItem를 (들)

를 추가하지 않습니다있다

b)는 코드가 JComponent에 (들)

C) 어쩌면이 추가 된 사용자 정의 구성 요소를 추가하지 않습니다, 다음 아무도