2012-07-03 11 views
5

W przykładach SwingX'a, który JXCollapsiblePane jest używany z przyciskiem, ale chcę go transponować za pomocą zdarzeń myszy. W moim przykładzie, JXCollapsiblePane jest zamykany na początku. Tylko wtedy, gdy użytkownik jest wyposażony w myszkę na przycisku, aby otworzyć JXCollapsiblePane. Kiedy mysz opuści obszar, który prawdopodobnie ponownie zwinął się JXCollapsiblePane. Mój problem: JXCollapsiblePane nie jest zwinięty, gdy mysz opuszcza obszar za pomocą przycisku.Wywołaj JXCollapsiblePane z myszką nad

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); 

    } 
} 

Dzięki

+0

Hej wiesz jak ustawić kierunek animacji przełączania? – mayooran

Odpowiedz

4

Impreza mouseExited jest wyzwalany, gdy kursor opuszcza JPanel - albo poprzez pozostawienie Granice JPanel lub wprowadzając jedną z podrzędne. Ponieważ przycisk znajduje się tuż przy krawędzi JPanel, kursor nigdy nie zostanie ponownie wprowadzony na ścieżce po lewej stronie, przez co nie można go opuścić.

Można zmodyfikować metodę w mouseEntered przycisk na MouseListener aby zwinąć panel sterowania, jeśli jest otwarty i niech istniejącego MouseListener obsłużyć przypadek, gdy użytkownik opuszcza przez granicę ramki. Musisz śledzić stan rozwijania/zwijania panelu kontrolnego (SwingX API prawdopodobnie robi to już dla ciebie), jeśli chcesz uniemożliwić użytkownikowi śledzenie przycisku i ponowne wywoływanie go (nie zawracałem sobie głowy kodem poniżej).

Mój zmodyfikowany MouseListener:

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

hej, czy możesz pomóc w tym pytaniu? http://stackoverflow.com/questions/36811734/collapsing-pane-and-table-using-swingx – mayooran

Powiązane problemy