2012-07-03 4 views
5

In den Beispielen von SwingX, die JXCollapsiblePane mit einer Schaltfläche verwendet wird, aber ich möchte es mit Mausereignissen transponieren. In meinem Beispiel ist der JXCollapsiblePane am Anfang geschlossen. Nur wenn der Benutzer mit der Maus auf die Schaltfläche kommt, um die JXCollapsiblePane zu öffnen. Wenn die Maus den Bereich verlässt, sollte JXCollapsiblePane wieder kollabieren. Mein Problem: Der JXCollapsiblePane wird nicht ausgeblendet, wenn die Maus den Bereich über die Schaltfläche verlässt.Trigger JXCollapsiblePane mit Maus über

public class CollapsiblePaneDemo 
{ 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) 
    { 
    final JXCollapsiblePane cp = 
     new JXCollapsiblePane(JXCollapsiblePane.Direction.RIGHT); 

    // JXCollapsiblePane can be used like any other container 
    cp.setLayout(new BorderLayout()); 

    // the Controls panel with a textfield to filter the tree 
    JPanel controls = new JPanel(new FlowLayout(FlowLayout.LEFT, 4, 0)); 
    controls.add(new JLabel("Search:")); 
    controls.add(new JTextField(10)); 
    controls.add(new JButton("Refresh")); 
    controls.setBorder(new TitledBorder("Filters")); 

    cp.add("Center", controls); 

    JXFrame frame = new JXFrame(); 
    frame.setLayout(new BorderLayout()); 

    // Then the tree - we assume the Controls would somehow filter the tree 
    JScrollPane scroll = new JScrollPane(new JTree()); 
    // Put the "Controls" first 
    frame.add("Center", scroll); 


    // Show/hide the "Controls" 
    final JButton toggle = new JButton(cp.getActionMap() 
     .get(JXCollapsiblePane.TOGGLE_ACTION)); 
    toggle.setText("-"); 
    toggle.setPreferredSize(new Dimension(20, toggle.getSize().height)); 

    toggle.addMouseListener(new MouseAdapter() 
    { 
     @Override 
     public void mouseEntered(MouseEvent e) 
     { 
     if (cp.getSize().width == 0) 
     { 

      toggle.doClick(); 
     } 
     } 
    }); 

    final JPanel panel = new JPanel(); 
    panel.setLayout(new BorderLayout()); 
    panel.add("Center", toggle); 
    panel.add("East", cp); 

    panel.addMouseListener(new MouseAdapter() 
    { 
     @Override 
     public void mouseExited(MouseEvent e) 
     { 
     if (!panel.contains(e.getPoint())) 
     { 
      toggle.doClick(); 
     } 
     } 
    }); 

    frame.add("East", panel); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    cp.setCollapsed(true); 
    frame.setVisible(true); 

    } 
} 

Danke,

+0

Hey wissen Sie, wie die Richtung der Toggle-Animation setzen? – mayooran

Antwort

4

Das mouseExited Ereignis ausgelöst wird, wenn der Cursor die JPanel Blätter - entweder durch die Grenzen des JPanel verlassen oder durch eine der Subkomponenten eingeben. Da sich der Button direkt am Rand der JPanel befindet, wird der Cursor nie wieder auf den Weg nach links in den JPanel eingetragen und kann diesen somit nicht verlassen.

Sie konnten die mouseEntered Methode in der MouseListener der Schaltfläche ändern das Bedienfeld zusammenbrechen, wenn es geöffnet ist und lassen Sie Ihre vorhandenen MouseListener den Fall behandeln, in denen der Benutzer durch die Frame-Rahmen verlässt. Sie müssen den expandierenden/kollabierenden Zustand des Kontrollfensters verfolgen (SwingX API tut dies wahrscheinlich schon für Sie), wenn Sie verhindern wollen, dass der Benutzer die Schaltfläche jagt und erneut auslöst (ich habe mich im Code nicht gestört) unten).

Meine modifizierte Mouselistener:

toggle.addMouseListener(new MouseAdapter() 
{ 
    @Override 
    public void mouseEntered(MouseEvent e) 
    { 
     toggle.doClick(); 
    } 
}); 
+0

Hey, kannst du mit dieser Frage helfen? http://stackoverflow.com/questions/36811734/collapsing-pane-and-table-using-swingx – mayooran