如何限制项目的可见性?

时间:2013-04-10 08:27:49

标签: javafx-2 visibility pane

想象一下,我们有一个AnchorPane,它有一个孩子Pane,例如我们有Button。 我希望此Button只能在此Pane中显示 换句话说,如果Pane边缘不完全在Pane之内,它将被Button边缘切割。现在即使Pane超出{{1}}矩形,{{1}}也可见。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:6)

您可以使用clipping功能来实现此目的。

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

答案 2 :(得分:5)

使用可观察量的另一种方法。要剪切窗格边界外的项目(如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);