2013-06-04 5 views
3

Я заинтересован, как я могу изменить размер этого компонента с помощью мышки:Как изменить размер компонента с перетаскиванием мышью в 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); 

Проблемы заключается в том, что у меня есть несколько компонентов, расположенных на главной сцене. Когда я изменяю размер одного компонента, например, увеличиваю высоту компонента, я должен уменьшить размер следующего компонента, не перешагивая на компонент. Как я могу это сделать?

ответ

5

Я думаю, что это стек стек, который вызывает проблему, он не поддерживает изменение размера поведения, как VBox или HBox. Я перетаскиваю свою собственную программу для изменения размеров компонентов TextArea или List, чтобы сделать их более крупными, если это необходимо. Проверьте код здесь:

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

и использование:

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

EDIT я вытащил Estimate, но сопротивление переклассификатор остается открытым исходным кодом в этом суть.

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

Или полный код.

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

Есть ли какой-нибудь простой пример, как я могу реализовать изменение размера компонента мыши? –

+0

Это так же просто, как и получается, используйте DragResizer и смотрите строки 174 и 175 TaskFormController. –

+0

На этом этапе эти ссылки сломаны. Непосредственное включение содержимого в сообщение позволяет избежать этой ошибки – OYRM

 Смежные вопросы

  • Нет связанных вопросов^_^