2013-04-10 167 views
7

想象一下,我们有一个AnchorPane,它有孩子Pane,我们有Button,例如。
我想要这个Button仅在此Pane内显示。
换句话说,如果它不完全在Pane之内,它将被Pane边缘削减。现在Button即使不在Pane矩形中也可以看到。如何限制物品的可见性?

回答

15

这就是节点的clip

实施例:

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

这产生:

without clip

在取消关于剪辑中的线生产:

with clip

6

可以使用clipping FUNC达到这个目标。

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

另一种方法,使用observables。删除窗格边界之外的项目(如css oveflow: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

虽然...这很棒,剪辑的初始大小似乎被忽略。有没有办法以任何方式修改它以保留标签边界? – Line 2018-02-20 06:28:11

相关问题