2016-01-18 1 views
0

Je travaille sur une application qui me permet d'afficher et de masquer les plans séparés. J'ai lu quelques articles sur comment obtenir ceci mais ce n'est pas ce que je cherche.jSplitPane Affichage et masquage du volet gauche lorsque la souris est sur

est ici le code Ive écrit:

Im actuellement en utilisant NetBeans.

private void jSplitPane1MouseEntered(java.awt.event.MouseEvent evt) {           
     if(MouseInfo.getPointerInfo().getLocation() == jSplitPane1.getLeftComponent().getLocation()){ 
      jSplitPane1.setDividerLocation(100); 
      System.out.println("Mouse Entered"); 
     }else{ 
      jSplitPane1.setDividerLocation(20); 
      System.out.println("Mouse Exited"); 
     } 
    } 

J'ai parlé à ces postes:

How to make JSplitPane auto expand on mouse hover?

Get Mouse Position

Ce que je veux arriver est quand je souris sur le côté gauche du jSplitPane, je recevrais le diviseur pour étendre à 100 selon ma première déclaration if, et quand il existe le côté gauche, il se rétracte à l'emplacement du diviseur 20.

+0

OK? La question est? – MadProgrammer

+0

Oh, je suis tellement désolé! Je me précipitais sur mon travail. Je vais éditer le post. – Bumpy

+0

voilà! J'en ai besoin pour changer en fonction de splitPane car mes splitpanes sont des panneaux dynamiques. – Bumpy

Répondre

2

C'est vraiment, vraiment difficile.

Vous pouvez utiliser un MouseListener sur le composant « gauche » et de surveiller les mouseEntered et mouseExited événements, mais ceux-ci auront également déclenché lorsque lorsque vous vous déplacez dans et hors d'un composant enfant qui a une MouseListener de son propre (comme un JButton).

D'accord, vous pouvez utiliser un MouseMotionListener sur le JSplitPane et surveiller l'événement mouseMoved et vérifier où le curseur de la souris est, mais cela va à l'enfer le moment, les composants (gauche/droite) obtiennent leur propre MouseListener, comme MouseEvent s ne sont plus livrés à l'JSplitPane

Ainsi, l'une des dernières options que vous avez est d'attacher une AWTListener globale à la file d'attente d'événements et surveiller les événements qui se produisent sur lui-même JSplitPane, par exemple ...

SplitPane

import java.awt.AWTEvent; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GridBagLayout; 
import java.awt.Toolkit; 
import java.awt.event.AWTEventListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JSplitPane; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Main { 

    public static void main(String[] args) { 
     new Main(); 
    } 

    public Main() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new BorderLayout()); 

      JSplitPane pane = new JSplitPane(); 
      pane.setLeftComponent(makePane(Color.RED)); 
      pane.setRightComponent(makePane(Color.BLUE)); 

      Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() { 
       @Override 
       public void eventDispatched(AWTEvent event) { 
        if (event instanceof MouseEvent) { 
         MouseEvent me = (MouseEvent) event; 
         if (pane.getBounds().contains(me.getPoint())) { 
          System.out.println("Global Motion in the pane..."); 
          me = SwingUtilities.convertMouseEvent(me.getComponent(), me, pane); 
          Component left = pane.getLeftComponent(); 
          if (left.getBounds().contains(me.getPoint())) { 
           pane.setDividerLocation(100); 
          } else { 
           pane.setDividerLocation(20); 
          } 
         } 
        } 
       } 
      }, MouseEvent.MOUSE_MOTION_EVENT_MASK); 

      // You don't need this, this is to demonstrate 
      // that mouse events aren't hitting your component 
      // via the listener 
      pane.addMouseMotionListener(new MouseAdapter() { 
       @Override 
       public void mouseMoved(MouseEvent e) { 
        System.out.println("Motion in the pane..."); 
        Component left = pane.getLeftComponent(); 
        if (left.getBounds().contains(e.getPoint())) { 
         pane.setDividerLocation(100); 
        } else { 
         pane.setDividerLocation(20); 
        } 
       } 

      }); 
      pane.setDividerLocation(20); 

      add(pane); 
     } 

     protected JPanel makePane(Color background) { 
      JPanel pane = new JPanel() { 
       @Override 
       public Dimension getPreferredSize() { 
        return new Dimension(100, 100); 
       } 
      }; 
      pane.setLayout(new GridBagLayout()); 
      pane.add(new JButton("...")); 
      pane.setBackground(background); 
      pane.addMouseListener(new MouseAdapter() { 
       @Override 
       public void mouseClicked(MouseEvent e) { 
        System.out.println("..."); 
       } 
      }); 
      return pane; 
     } 

    } 

} 
+0

désolé pour la réponse tardive et merci pour la réponse. Je vois son fonctionnement assez bien, mais pour être honnête, je ne suis pas sûr de savoir comment je vais ajouter cela à mon application. J'utilise des beans nets et je ne suis pas encore familier avec l'ajout de codes personnalisés aux composants, mais ce que j'ai compris de votre code est: '1. Vous avez pris les limites du volet et vérifié si elle contient l'emplacement actuel de la souris. »Puis, après cela, j'ai été confus. – Bumpy

+0

Essentiellement, la première chose que j'ai faite a été de vérifier si le 'MouseEvent # point' était dans les limites du' JSplitPane', puis j'ai converti le 'MouseEvent' dans le contexte de' JSplitPane' et ensuite de vérifier si le 'MouseEvent' est dans le contexte du' leftPane'. 'MouseEvent's sont contextuels et sont automatiquement convertis dans le contexte de coordonnées du composant qui les génère (c'est-à-dire que 0x0 est le coin haut/gauche du composant) – MadProgrammer

+0

Merci! ça marche maintenant! merci d'expliquer le concept. Je veux juste comprendre comment cela fonctionne avant de mettre les choses. Je vais devoir compiler ceci car cela sera utile dans le futur. – Bumpy