2013-06-04 7 views
3

Je suis intéressé comment je peux redimensionner ce composant avec glisser la souris:Comment redimensionner le composant avec glisser la souris dans JavaFX

VBox stackedTitledPanes = createStackedTitledPanes(); 

    ScrollPane scroll = makeScrollable(stackedTitledPanes); 

    TabPane tabPane = new TabPane(); 
    BorderPane mainPane = new BorderPane(); 

    tabPane.setStyle("-fx-font-size: 12pt;"); // Set global size for the font 
    // Create Tabs 
    Tab tabA = new Tab(); 
    tabA.setText("Main Component"); 
    tabA.setStyle("-fx-font-size: 12pt;"); // Set size of the tab name 
    // Add something in Tab 
    StackPane tabA_stack = new StackPane(); 
    tabA_stack.setAlignment(Pos.CENTER); 
    tabA_stack.getChildren().add(scroll); 
    tabA.setContent(tabA_stack); 
    tabPane.getTabs().add(tabA); 

    Tab tabB = new Tab(); 
    tabB.setText("Second Component"); 
    tabB.setStyle("-fx-font-size: 12pt;"); // Set size of the tab name 
    // Add something in Tab 
    StackPane tabB_stack = new StackPane(); 
    tabB_stack.setAlignment(Pos.CENTER); 
    tabB_stack.getChildren().add(new Label("[email protected] B")); 
    tabB.setContent(tabB_stack); 
    tabPane.getTabs().add(tabB); 

    Tab tabC = new Tab(); 
    tabC.setText("Last Component"); 
    tabC.setStyle("-fx-font-size: 12pt;"); // Set size of the tab name 
    // Add something in Tab 
    StackPane tabC_vBox = new StackPane(); 
    tabC_vBox.setAlignment(Pos.CENTER); 
    tabC_vBox.getChildren().add(new Label("[email protected] C")); 
    tabC.setContent(tabC_vBox); 
    tabPane.getTabs().add(tabC); 

    mainPane.setCenter(tabPane); 

    mainPane.setPrefSize(395, 580); 
    mainPane.setLayoutX(850); 
    mainPane.setLayoutY(32); 

    scroll.setPrefSize(395, 580); 
    scroll.setLayoutX(850); 
    scroll.setLayoutY(32); 

    root.getChildren().add(mainPane); 

Le problème est que j'ai plusieurs composants placés sur la scène principale. Lorsque je redimensionne un composant, par exemple augmenter la hauteur du composant, je dois réduire la taille du composant suivant sans enjamber le composant. Comment puis-je faire ceci?

Répondre

5

Je pense qu'il est pile volet qui est l'origine du problème, il ne supporte pas le comportement comme redimensionne VBox ou HBox fait. Je suis en train de faire glisser dans mon propre programme pour redimensionner les composants TextArea ou List pour les agrandir si nécessaire. Consultez le code ici:

https://bitbucket.org/atill/estimate/src/22390a2ca034b55f1916e46435b714e5c489b90e/src/main/java/projmon/ui/DragResizer.java?at=master

et utilisation:

https://bitbucket.org/atill/estimate/src/22390a2ca034b55f1916e46435b714e5c489b90e/src/main/java/projmon/control/TaskFormController.java?at=master

EDIT J'ai tiré, mais la Resizer estimation de traînée est encore open source dans ce point essentiel.

https://gist.github.com/andytill/4369729

Ou le code complet.

import javafx.event.EventHandler; 
import javafx.scene.Cursor; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.Region; 

/** 
* {@link DragResizer} can be used to add mouse listeners to a {@link Region} 
* and make it resizable by the user by clicking and dragging the border in the 
* same way as a window. 
* <p> 
* Only height resizing is currently implemented. Usage: <pre>DragResizer.makeResizable(myAnchorPane);</pre> 
* 
* @author atill 
* 
*/ 
public class DragResizer { 

    /** 
    * The margin around the control that a user can click in to start resizing 
    * the region. 
    */ 
    private static final int RESIZE_MARGIN = 5; 

    private final Region region; 

    private double y; 

    private boolean initMinHeight; 

    private boolean dragging; 

    private DragResizer(Region aRegion) { 
     region = aRegion; 
    } 

    public static void makeResizable(Region region) { 
     final DragResizer resizer = new DragResizer(region); 

     region.setOnMousePressed(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent event) { 
       resizer.mousePressed(event); 
      }}); 
     region.setOnMouseDragged(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent event) { 
       resizer.mouseDragged(event); 
      }}); 
     region.setOnMouseMoved(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent event) { 
       resizer.mouseOver(event); 
      }}); 
     region.setOnMouseReleased(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent event) { 
       resizer.mouseReleased(event); 
      }}); 
    } 

    protected void mouseReleased(MouseEvent event) { 
     dragging = false; 
     region.setCursor(Cursor.DEFAULT); 
    } 

    protected void mouseOver(MouseEvent event) { 
     if(isInDraggableZone(event) || dragging) { 
      region.setCursor(Cursor.S_RESIZE); 
     } 
     else { 
      region.setCursor(Cursor.DEFAULT); 
     } 
    } 

    protected boolean isInDraggableZone(MouseEvent event) { 
     return event.getY() > (region.getHeight() - RESIZE_MARGIN); 
    } 

    protected void mouseDragged(MouseEvent event) { 
     if(!dragging) { 
      return; 
     } 

     double mousey = event.getY(); 

     double newHeight = region.getMinHeight() + (mousey - y); 

     region.setMinHeight(newHeight); 

     y = mousey; 
    } 

    protected void mousePressed(MouseEvent event) { 

     // ignore clicks outside of the draggable margin 
     if(!isInDraggableZone(event)) { 
      return; 
     } 

     dragging = true; 

     // make sure that the minimum height is set to the current height once, 
     // setting a min height that is smaller than the current height will 
     // have no effect 
     if (!initMinHeight) { 
      region.setMinHeight(region.getHeight()); 
      initMinHeight = true; 
     } 

     y = event.getY(); 
    } 
} 
+0

Existe-t-il un exemple simple comment je peux implémenter le redimensionnement de la souris du composant? Ce –

+0

est aussi simple que cela, utilisez DragResizer et voir les lignes 174 et 175 de TaskFormController. –

+0

À ce stade, ces liens sont rompus. L'inclusion directe du contenu dans le message évite cet écueil – OYRM

Questions connexes