0

oneTouchExpandable を true に設定した JSplitPane があります。

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

問題は、JSplitPane のディバイダーの上下矢印にキー バインディングを付ける方法がわからないことです。上矢印の場合は Ctrl+U、下矢印の場合は Ctrl + D が必要です。

ありがとう!

4

2 に答える 2

3

問題は、JSplitPane の仕切りの上下の矢印にキー バインディングを付ける方法がわからないことです。

通常、ボタンのアクションにアクセスしようとします。多くの場合、コンポーネントは使用可能なアクションをすでに定義しています。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 から拡張されている場合にのみ機能します。

于 2013-11-01T16:02:20.523 に答える
3

で示される矢印ボタンの実装OneTouchExpandableは UI ラベルであり、それらをバインドするために不必要に余分な作業が必要になります。を使用して分割位置を制御するために、キー バインドJSplitPane自体を簡単に使用できます。で増加し、 で減少します。例えば:JSplitPanesetDividerLocation(int)Ctrl + UCtrl + 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);

注: method に 0 未満の値が渡されsetDividerLocation(int) た場合は、左側/上部コンポーネントの優先サイズを尊重しようとする値に分周器をリセットする必要があることを意味します。リスナーに通知した後、 を介して最後の仕切りの位置が更新されsetLastDividerLocationます。

于 2013-11-01T14:53:06.567 に答える