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?
7
A
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:
die Linien in Bezug auf den Clip uncommenting produziert:
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);
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