2017-07-01 8 views
0

Au début, la barre de titre de mon JInternalFrame est masquée (((BasicInternalFrameUI) iw.getUI()).setNorthPane(null)). Dès que la souris entre dans la bordure des cadres, je veux à nouveau montrer la barre de titre jusqu'à ce que la bordure ou la barre de titre elle-même déclenche un mouseExit.JInternalFrame afficher dynamiquement et masquer la barre de titre

Ce fut mon premier essai:

public class InternalWindow extends JInternalFrame{ 
    public InternalWindow(){ 
     ((BasicInternalFrameUI) iw.getUI()).setNorthPane(null); 
     setResizable(true); 
     setVisible(true); 

     addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseEntered(MouseEvent e) { 
       ((BasicInternalFrameUI) iw.getUI()).setNorthPane(new BasicInternalFrameTitlePane(iw)); 
       ((BasicInternalFrameUI) iw.getUI()).getNorthPane().revalidate(); 
       ((BasicInternalFrameUI) iw.getUI()).getNorthPane().repaint(); 
       setFrameIcon(null); 
       revalidate(); 
       repaint(); 
       ((BasicInternalFrameUI) iw.getUI()).getNorthPane().addMouseListener(new MouseAdapter() { 
        @Override 
        public void mouseExited(MouseEvent e) { 
         ((BasicInternalFrameUI) iw.getUI()).setNorthPane(null); 
         revalidate(); 
         repaint(); 
        } 
       }); 
      } 
      @Override 
      public void mouseExited(MouseEvent e) { 
       ((BasicInternalFrameUI) iw.getUI()).setNorthPane(null); 
       revalidate(); 
       repaint(); 
      } 
     }); 
    } 
} 

Mais la barre de titre n'est pas dessiné correctement et ne réagit pas sur les interactions. (picture here)

Alors je l'ai essayé une autre façon:

public class InternalWindow extends JInternalFrame{ 
    public InternalWindow(){ 
     ((BasicInternalFrameUI) iw.getUI()).setNorthPane(null); 
     setResizable(true); 
     setVisible(true); 

     addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseEntered(MouseEvent e) { 
       updateUI(); 
       setFrameIcon(null); 
       ((BasicInternalFrameUI) iw.getUI()).getNorthPane().addMouseListener(new MouseAdapter() { 
        @Override 
        public void mouseExited(MouseEvent e) { 
         ((BasicInternalFrameUI) iw.getUI()).setNorthPane(null); 
         revalidate(); 
         repaint(); 
        } 
       }); 
      } 
      @Override 
      public void mouseExited(MouseEvent e) { 
       ((BasicInternalFrameUI) iw.getUI()).setNorthPane(null); 
       revalidate(); 
       repaint(); 
      } 
     }); 
    } 
} 

De cette façon, la barre de titre est dessiné correctement, mais donc l'AWT-EventQueue déclenche une exception qui empêche la mouseExited attachée à la frontière à appeler:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at javax.swing.plaf.basic.BasicInternalFrameUI.updateFrameCursor(BasicInternalFrameUI.java:317) 
    at javax.swing.plaf.basic.BasicInternalFrameUI$BorderListener.mouseEntered(BasicInternalFrameUI.java:1086) 
    at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:300) 
    at java.awt.Component.processMouseEvent(Component.java:6544) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) 
    at java.awt.Component.processEvent(Component.java:6300) 
    at java.awt.Container.processEvent(Container.java:2236) 
    at java.awt.Component.dispatchEventImpl(Component.java:4891) 
    at java.awt.Container.dispatchEventImpl(Container.java:2294) 
    at java.awt.Component.dispatchEvent(Component.java:4713) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) 
    at java.awt.LightweightDispatcher.retargetMouseEnterExit(Container.java:4676) 
    at java.awt.LightweightDispatcher.trackMouseEnterExit(Container.java:4654) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4505) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) 
    at java.awt.Container.dispatchEventImpl(Container.java:2280) 
    at java.awt.Window.dispatchEventImpl(Window.java:2750) 
    at java.awt.Component.dispatchEvent(Component.java:4713) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) 
    at java.awt.EventQueue.access$500(EventQueue.java:97) 
    at java.awt.EventQueue$3.run(EventQueue.java:709) 
    at java.awt.EventQueue$3.run(EventQueue.java:703) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) 
    at java.awt.EventQueue$4.run(EventQueue.java:731) 
    at java.awt.EventQueue$4.run(EventQueue.java:729) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 

N'y a-t-il pas un moyen simple de masquer et d'afficher dynamiquement la barre de titre?

Répondre

0

Ok, je viens de trouver une sorte de piratage en enregistrant simplement deux MouseListeners séparés pour mouseEntered et mouseExited de la bordure et en supprimant celui pour mouseExited dans mouseEntered et en le lisant dans la mouseExited de la barre de titre. Mais je suis sûr qu'il doit y avoir un moyen plus élégant d'y parvenir ...

MouseAdapter ma1 = new MouseAdapter() { 
     @Override 
     public void mouseExited(MouseEvent e) { 
      ((BasicInternalFrameUI) iw.getUI()).setNorthPane(null); 
      revalidate(); 
      repaint(); 
     } 
    }; 

    addMouseListener(new MouseAdapter() { 
     @Override 
     public void mouseEntered(MouseEvent e) { 
      updateUI(); 
      setFrameIcon(null); 
      ((BasicInternalFrameUI) iw.getUI()).getNorthPane().addMouseListener(new MouseAdapter() { 
       @Override 
       public void mouseExited(MouseEvent e) { 
        ((BasicInternalFrameUI) iw.getUI()).setNorthPane(null); 
        revalidate(); 
        repaint(); 
        addMouseListener(ma1); 
       } 
      }); 
      removeMouseListener(ma1); 
     } 
    });