2013-04-10 3 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

Другой подход, с использованием наблюдаемых. Чтобы закрепить элементы за пределами границ панели (например, 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

Смежные вопросы