2013-11-27 53 views
0

我想用Swing佈局製作一個Java程序,其中左側有一個菜單,當鼠標懸停在菜單區域上時展開,但在鼠標離開後自動收縮。如何讓JSplitPane在鼠標懸停時自動展開?

我想模仿移動Youtube for Android或Weebly的編輯器的效果。對於那些不知道的人來說,當鼠標懸停在他們身上時,兩個佈局的左側菜單都會展開。然後在你的鼠標離開該區域後,菜單再次收縮並且不在視野中。

我能夠創建一個包含我的菜單成功的JSplitPane,但我不知道怎麼做,當用戶的鼠標懸停在JSplitPane組件,或如何鼠標離開後區使之收縮,它會自動擴大。

如果有人想知道爲什麼:這種類型的菜單很容易讓用戶使用,但由於它在不需要時隱藏起來,使我可以爲程序的主要部分留出更多空間。

任何幫助,將不勝感激謝謝!

+0

一點題外話,但你可能有興趣在看看[滑動佈局](https://github.com/AurelienRibon/sliding-layout) – MadProgrammer

+0

@MadProgrammer看起來很有趣,會考慮,從這個例子顯示的東西類似於我想要的東西謝謝! – XQEWR

+0

'那些不知道的人,兩個佈局的左邊都有菜單,當你的鼠標懸停在它們上面時,這些菜單就會展開。'==嗯,例如,我不知道,你必須搜索手風琴,其中一些是反應到鼠標事件 – mKorbel

回答

2

那麼使用jSplitPan.setDividerLocation(location);:設置分隔符的位置。 location - 一個指定UI特定值(通常是像素數)的int值。

jSplitPane1.addMouseMotionListener(new MouseMotionAdapter() { 
      public void mouseMoved(MouseEvent evt) { 
       // use evt.getSource() if needed 
       jSplitPan1.setDividerLocation(location); 
      } 
     }); 

您可能需要智能地計算分頻器的位置。提示:通過計算相關的首選大小提示。相關部分應該由您發現。

查看官方教程頁面瞭解:How to use MouseMotionListeners包括其他事件偵聽器。

+0

是的,我認爲我理解這個部分,但是我正在尋找的是如何通過將鼠標懸停在JSplitPane上來移動它。也許缺少MouseListener?但我不完全知道 – XQEWR

+0

yare,yeare更新了答案。但我想我應該鏈接你的事件監聽器網站。在等待。 – Sage

+0

這是一個有點題外話,但這會使分裂面板動畫化嗎?或者它會立即打開菜單?如果它沒有動畫,有沒有辦法做到這一點? – XQEWR

2

有兩個基本問題......

  1. 你需要在它存在的「菜單」

第二,當鼠標懸停在分頻器和

  • 檢測比較很容易,您可以使用MouseListener並監視mouseExit事件,並在鼠標離開時設置拆分窗格分隔線的位置。

    這是複雜的,雖然,因爲如果用戶所在的「菜單」,由跨過護欄,這可能會觸發「菜單」,再次可見發...

    的第一個問題是比較複雜的,因爲JSplitPane包含三個組件,即左側和右側組件,還包含分頻器組件。 JSplitPane實際上並不允許訪問分頻器,這非常煩人,並且因爲它使用它自己的鼠標偵聽器,所以它阻止了鼠標事件進入分割本身。

    相反,您需要通過UI委託來訪問它。

    一旦你設置了鼠標監聽器,您需要確保當菜單是隱藏的,爲此,該菜單纔會顯示,我只是檢查了「菜單」組件

    的尺寸。例...

    import java.awt.Color; 
    import java.awt.Dimension; 
    import java.awt.EventQueue; 
    import java.awt.Insets; 
    import java.awt.Rectangle; 
    import java.awt.event.MouseAdapter; 
    import java.awt.event.MouseEvent; 
    import java.awt.event.MouseListener; 
    import java.awt.event.MouseMotionAdapter; 
    import javax.swing.JFrame; 
    import javax.swing.JPanel; 
    import javax.swing.JSplitPane; 
    import javax.swing.UIManager; 
    import javax.swing.UnsupportedLookAndFeelException; 
    import javax.swing.plaf.basic.BasicSplitPaneDivider; 
    import javax.swing.plaf.basic.BasicSplitPaneUI; 
    
    public class TestSpltPane { 
    
        public static void main(String[] args) { 
         new TestSpltPane(); 
        } 
    
        public TestSpltPane() { 
         EventQueue.invokeLater(new Runnable() { 
          @Override 
          public void run() { 
           try { 
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
           } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
            ex.printStackTrace(); 
           } 
    
           final JPanel left = new JPanel(); 
           left.setBackground(Color.RED); 
           left.setPreferredSize(new Dimension(100, 100)); 
           JPanel right = new JPanel(); 
           right.setBackground(Color.BLUE); 
           right.setPreferredSize(new Dimension(100, 100)); 
           final JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, left, right); 
           sp.setDividerLocation(0); 
    
           BasicSplitPaneDivider divider = ((BasicSplitPaneUI) sp.getUI()).getDivider(); 
           divider.addMouseListener(new MouseAdapter() { 
    
            @Override 
            public void mouseEntered(MouseEvent e) { 
             if (left.getWidth() == 0) { 
              sp.setDividerLocation(100); 
             } 
            } 
    
           }); 
    
           left.addMouseListener(new MouseAdapter() { 
    
            @Override 
            public void mouseExited(MouseEvent e) { 
             sp.setDividerLocation(0); 
            } 
    
           }); 
    
           JFrame frame = new JFrame("Testing"); 
           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
           frame.add(sp); 
           frame.pack(); 
           frame.setLocationRelativeTo(null); 
           frame.setVisible(true); 
          } 
         }); 
        } 
    
    } 
    
  • 相關問題