2013-04-10 19 views
7

Wyobraź sobie, że mamy AnchorPane, ma dziecko Pane i tam mamy na przykład Button.
Chcę, aby ten Button był wyświetlany tylko wewnątrz tego Pane.
Innymi słowy, może zostać przycięty przez krawędzie Pane, jeśli nie jest całkowicie w granicach Pane. Teraz Button może być widoczny, nawet jeśli znajduje się poza prostokącie Pane.Jak ograniczyć widoczność przedmiotów?

Odpowiedz

15

jest to, do czego służy clip węzła.

Przykład:

import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.layout.StackPane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Rectangle; 
import javafx.stage.Stage; 


public class ClipTest extends Application { 

    public static void main(String[] args) { 
    launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 

    Group root = new Group(); 

    StackPane pane = new StackPane(); 

    pane.setMaxWidth(100); 
    pane.setMaxHeight(100); 
    pane.setLayoutX(50); 
    pane.setLayoutY(50); 


    Rectangle rect = new Rectangle(100, 100); 

    rect.setFill(null); 
    rect.setStroke(Color.RED); 

    Rectangle rect2 = new Rectangle(150, 150); 

    rect2.setFill(Color.BLUE); 

    pane.getChildren().addAll(rect2, rect); 

    root.getChildren().add(pane); 


// Rectangle clip = new Rectangle(100, 100); 
// clip.setLayoutX(25); 
// clip.setLayoutY(25); 
// pane.setClip(clip); 

    Scene scene = new Scene(root, 250, 250); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
    } 
} 

ta produkuje:

without clip

odkomentowanie wiersze dotyczące klipu produkuje:

with clip

6

Można użyć clipping func w celu osiągnięcia tego.

public class ClipPane extends Application { 

    @Override 
    public void start(Stage stage) throws Exception { 
     Pane clipPane = new Pane(); 
     clipPane.setStyle("-fx-border-color: red;"); 
     clipPane.setPrefSize(200, 200); 

     Rectangle rect = new Rectangle(200, 200); 
     clipPane.setClip(rect); 

     Button btn = new Button("Hello, world!"); 
     btn.relocate(120, 0); 
     clipPane.getChildren().add(btn); 

     AnchorPane root = new AnchorPane(); 
     root.getChildren().add(clipPane); 
     AnchorPane.setTopAnchor(clipPane, 50.); 
     AnchorPane.setLeftAnchor(clipPane, 50.); 

     stage.setScene(new Scene(root, 300, 300)); 
     stage.show(); 
    } 

    public static void main(String[] args) { launch(); } 
} 
4

Inne podejście, z wykorzystaniem obserwowalnych. Aby przypiąć elementy poza obramowaniem szyby (np. Oveflow css: hidden):

// create rectangle with sizes of pane, 
// dont need to set x and y explictly 
// as positions of clip node are relative to parent node 
// (to pane in our case) 
Rectangle clipRect = new Rectangle(pane.getWidth(), pane.getHeight()); 

// bind properties so height and width of rect 
// changes according pane's width and height 
clipRect.heightProperty().bind(pane.heightProperty()); 
clipRect.widthProperty().bind(pane.widthProperty()); 

// set rect as clip rect 
pane.setClip(clipRect); 
+0

To świetnie, ale ... Początkowy rozmiar klipu wydaje się być ignorowany. Czy istnieje sposób, aby zmodyfikować to w jakikolwiek sposób, aby zachować granicę etykiety? – Line