2013-11-01 51 views
0

我有JSplitPane的oneTouchExpandable設置爲true。如何將鍵綁定到JSplitPane分隔線的向上和向下箭頭?

JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT); 
     splitPane.setDividerSize(10); 
     splitPane.setOneTouchExpandable(true); 

的問題是,我不知道如何連接鍵綁定,以向上和向下調整JSplitPane的分隔箭頭。對於向上箭頭,我想Ctrl + U和向下 - Ctrl + D.

謝謝!

回答

3

問題是我不知道如何將鍵綁定附加到JSplitPane分隔線上的向上和向下箭頭。

通常你會嘗試訪問按鈕的動作。在很多情況下,組件將已經定義了一個可以使用的Action。請參閱Key Bindings以獲取JSplitPane的默認綁定列表。不幸的是,沒有操作來支持單觸點擊選項。

因此,我們需要從UI直接訪問按鈕:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.plaf.basic.*; 

public class SplitPaneDividerAction extends AbstractAction 
{ 
    private boolean leading; 

    public SplitPaneDividerAction(boolean leading) 
    { 
     this.leading = leading; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     JSplitPane splitPane = (JSplitPane)e.getSource(); 
     BasicSplitPaneUI ui = (BasicSplitPaneUI)splitPane.getUI(); 
     BasicSplitPaneDivider divider = ui.getDivider(); 

     if (leading) 
      ((JButton)divider.getComponent(0)).doClick(); 
     else 
      ((JButton)divider.getComponent(1)).doClick(); 
    } 

    private static void createAndShowUI() 
    { 
     JPanel leading = new JPanel(); 
     leading.setPreferredSize(new Dimension(200, 100)); 
     leading.setBackground(Color.BLUE); 
     leading.setFocusable(true); 

     JPanel trailing = new JPanel(); 
     trailing.setPreferredSize(new Dimension(200, 100)); 
     trailing.setBackground(Color.RED); 
     trailing.setFocusable(true); 

     JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leading, trailing); 
     splitPane.setOneTouchExpandable(true); 
     splitPane.setDividerLocation(100); 

     InputMap im = splitPane.getInputMap(JSplitPane.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 
     ActionMap am = splitPane.getActionMap(); 
     im.put(KeyStroke.getKeyStroke("control U"), "leading"); 
     im.put(KeyStroke.getKeyStroke("control D"), "trailing"); 
     am.put("leading", new SplitPaneDividerAction(true)); 
     am.put("trailing", new SplitPaneDividerAction(false)); 

     JFrame frame = new JFrame("SSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(splitPane); 
     frame.setSize(200, 200); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 

當然,如果您的LAF從BasicSplitPaneUI的延伸,這種方法纔有效。

+0

我試了一下,它岩石! –

3

OneTouchExpandable顯示的箭頭按鈕的實現是UI標籤,並且會花費額外的工作來不必要地綁定它們。您可以使用JSplitPane本身輕鬆使用密鑰綁定來控制JSplitPane分頻器位置,使用setDividerLocation(int)Ctrl + U增加,Ctrl + D減少。例如:

Action incrDividerLoc = new AbstractAction() { 
    public void actionPerformed(ActionEvent e) { 
     JSplitPane srcSplitPan = (JSplitPane) e.getSource(); 
     (srcSplitPan).setDividerLocation(srcSplitPan.getDividerLocation()+10); 
    } 
    }; 

    Action decrDividerLoc = new AbstractAction() { 
    public void actionPerformed(ActionEvent e) { 
     JSplitPane srcSplitPan = (JSplitPane) e.getSource(); 
     (srcSplitPan).setDividerLocation(srcSplitPan.getDividerLocation()-10); 
    } 
    }; 

    jSplitPane1.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_U, KeyEvent.CTRL_DOWN_MASK), 
           "increaseDivider"); 
    jSplitPane1.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_D, KeyEvent.CTRL_DOWN_MASK), 
           "decreaseDivider"); 
    jSplitPane1.getActionMap().put("increaseDivider", incrDividerLoc); 
    jSplitPane1.getActionMap().put("decreaseDivider", decrDividerLoc); 

注:方法小於0傳遞到setDividerLocation(int)甲值意味着分頻器應復位到試圖兌現左/頂部部件的優選尺寸的值。通知收聽者後,通過setLastDividerLocation更新最後的分頻器位置。

+0

+1,但是splitpane引用應該來自ActionEvent的getSource()方法。 – camickr

+0

@camickr,但我仍然會聽你的。 :) *編輯* – Sage

相關問題