2013-11-01 4 views
0

У меня есть JSplitPane, у которого oneTouchExpandable установлен в true.Как подключить привязку клавиш к стрелкам вверх и вниз разделителя JSplitPane?

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

Проблема заключается в том, что я не знаю, как прикрепить клавиш вверх и вниз стрелки на делитель в Панель с разделителем. Для стрелки вверх я хочу Ctrl + U и для down - Ctrl + D.

Спасибо!

ответ

3

Проблема в том, что я не знаю, как прикреплять привязки клавиш к стрелкам вверх и вниз на разделителе JSplitPane.

Обычно вы пытаетесь получить доступ к действию кнопки. Во многих случаях компонент уже определит действие, которое вы можете использовать. См. Key Bindings для списка привязок по умолчанию для JSplitPane. К сожалению, нет действий для поддержки одноразовых щелчков.

Таким образом, мы должны получить доступ к кнопкам непосредственно из пользовательского интерфейса:

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, является ярлыком пользовательского интерфейса, и для их привязки потребуется дополнительная работа. Вы можете легко использовать привязку клавиш на 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 должна исходить из метода getSource() ActionEvent. – camickr

+0

@camickr, Но все же я буду слушать вас. :) * Отредактировано * – Sage