2016-05-26 8 views
2

JSplitPaneに2つのJPanelを結合しました。ユーザーはスプリットペインデバイダを非常に自由に動かすことができますが、デバイダは大きすぎないようにしてください(場合によっては1pxのみ)。JSplitPane小さな境界線ですが大きなグラブヒットボックス

dividerSizeを1に保つ方法がありますが、仕切りをクリックするとヒットボックスが大きくなりますか?だから、マウスをクリックしたときに各側に20pxの分周器がつかまることもありますか?

答えて

2

コンポーネントにMouseListenerを追加すると、仕切りの位置を手動で調整できます。ここで

あなたが始めるために基本的な例である:

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

public class DividerListener extends MouseAdapter 
{ 
    private JSplitPane splitPane; 
    private Component component; 
    private int pressedX; 
    private int dividerLocation; 

    public DividerListener(JSplitPane splitPane, Component component) 
    { 
     this.splitPane = splitPane; 
     this.component = component; 
     component.addMouseListener(this); 
     component.addMouseMotionListener(this); 
    } 

    @Override 
    public void mousePressed(MouseEvent e) 
    { 
     pressedX = SwingUtilities.convertPoint(component, e.getPoint(), splitPane).x; 
     dividerLocation = splitPane.getDividerLocation(); 
    } 

    @Override 
    public void mouseDragged(MouseEvent e) 
    { 

     int draggedX = SwingUtilities.convertPoint(component, e.getPoint(), splitPane).x; 
     int deltaX = draggedX - pressedX; 
     splitPane.setDividerLocation(dividerLocation + deltaX); 
    } 

    private static void createAndShowGUI() 
    { 
     JSplitPane splitPane = new JSplitPane(); 

     JLabel left = new JLabel("LEFT"); 
     splitPane.setLeftComponent(left); 
     new DividerListener(splitPane, left); 

     JLabel right = new JLabel("RIGHT"); 
     splitPane.setRightComponent(right); 
     new DividerListener(splitPane, right); 

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

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(() -> createAndShowGUI()); 
/* 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
*/ 
    } 
} 

あなたはマウスが左コンポーネントまたは右の左端の右端に押されたかどうかをチェックするためのロジックをカスタマイズする必要があります成分。したがって、境界チェックの方法を知るためには、おそらく別のパラメータを追加する必要があります。

次に、エッジに十分接近していないときにmouseDraggedコードがイベントを処理するか、無視するようにフラグを設定する必要があります。

関連する問題