2016-05-26 5 views
2

J'ai deux JPanels combinés dans un JSplitPane. L'utilisateur devrait être capable de déplacer le diviseur de vitre fractionnée très librement, mais le diviseur ne devrait pas être trop grand (dans le meilleur des cas seulement 1px).JSplitPane petite bordure mais grosse benne noire

Existe-t-il un moyen de conserver dividerSize à 1 mais d'augmenter la hitbox pour cliquer sur le diviseur? Alors que peut-être 20px de chaque côté, le diviseur est également saisi lorsque la souris est cliquée?

Répondre

2

Vous pouvez ajouter MouseListener aux composants et ajuster manuellement l'emplacement du diviseur.

Voici un exemple de base pour vous aider à démarrer:

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(); 
      } 
     }); 
*/ 
    } 
} 

Vous aurez besoin de personnaliser la logique pour vérifier si la souris est pressé sur le bord droit de l'élément gauche ou le bord gauche du droit composant. Vous devrez donc probablement ajouter un autre paramètre pour savoir comment effectuer la vérification des limites.

Ensuite, vous devrez définir un drapeau pour que le code mouseDragged puisse traiter l'événement ou l'ignorer lorsque vous n'êtes pas assez proche du bord.