2013-04-10 8 views
7

Stellen Sie sich vor, wir haben ein AnchorPane, es hat Kind Pane und dort haben wir zum Beispiel Button.
Ich möchte diese Button nur innerhalb dieser Pane angezeigt werden.
Mit anderen Worten, es sollte durch die Pane Kanten geschnitten werden, wenn es nicht vollständig innerhalb Pane ist. Jetzt kann die Button sichtbar sein, auch wenn es aus Pane Rechteck ist.Wie kann die Sichtbarkeit von Objekten eingeschränkt werden?

Antwort

15

Dies ist, was die clip eines Knotens gemacht ist.

Beispiel:

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

Dies erzeugt:

without clip

die Linien in Bezug auf den Clip uncommenting produziert:

with clip

6

Sie clipping func verwenden können um dies zu erreichen.

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

Ein anderer Ansatz, mit der Verwendung von Observablen. So schneiden Sie Objekte außerhalb der Fenstergrenzen ab (z. B. css oveflow: versteckt):

// 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

Das ist großartig, aber ... Die anfängliche Größe des Clips scheint ignoriert zu werden. Gibt es eine Möglichkeit, dies zu ändern, um die Etikettengrenze beizubehalten? – Line