2013-03-24 2 views
0

Мне нужно создать объекты Shape, в которых есть пустое пространство. Пример можно увидеть ниже: enter image description hereКадрирование JavaFX 2 Объекты формы

В настоящее время пробел - это еще один белый прямоугольник, хотя я бы действительно хотел, чтобы он был пустым - см. За синим прямоугольником. Это возможно? Я не мог найти решений по реализации этого эффекта. Это мой код:

package StackPaneTest; 

import javafx.application.Application; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.fxml.Initializable; 
import javafx.scene.Group; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.layout.StackPane; 
import javafx.scene.shape.Rectangle; 
import javafx.scene.shape.Shape; 
import javafx.stage.Stage; 

import java.io.IOException; 
import java.net.URL; 
import java.util.ResourceBundle; 


public class StackedPaneController extends Application 
     implements Initializable { 


    @FXML // fx:id="panelBlock" 
    private StackPane panelBlock; // Value injected by FXMLLoader 
    @FXML 
    private Rectangle body; 
    @FXML 
    private Rectangle redBox; 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override // This method is called by the FXMLLoader when initialization is complete 
    public void initialize(URL fxmlFileLocation, ResourceBundle resources) { 
     Shape newShape = Shape.subtract(body, redBox); 
     panelBlock.getChildren().add(0, newShape); 
     panelBlock.getChildren().remove(body); 

    } 

    @Override 
    public void start(Stage primaryStage) { 
     primaryStage.setTitle("The test"); 
     Group root = new Group(); 

     try { 
      root.getChildren().add((Node) FXMLLoader.load(getClass().getResource("StackedPaneBlock.fxml"))); 
     } catch (IOException e) { 
      e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
     } 

     Scene scene = new Scene(root, 400, 400); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

    } 
} 

И файл FXML:

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.paint.*?> 
<?import javafx.scene.shape.*?> 
<?import javafx.scene.text.*?> 

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" fx:controller="StackPaneTest.StackedPaneController"> 
    <children> 
    <StackPane fx:id="panelBlock" layoutX="136.0" layoutY="74.0" prefHeight="126.0" prefWidth="185.0"> 
     <children> 
     <Rectangle fx:id="body" arcHeight="5.0" arcWidth="5.0" fill="DODGERBLUE" height="200.0" stroke="BLACK" strokeType="INSIDE" width="200.0" /> 
     <Rectangle fx:id="redBox" arcHeight="5.0" arcWidth="5.0" fill="RED" height="48.99658203125" stroke="BLACK" strokeType="INSIDE" width="59.0" /> 
     </children> 
    </StackPane> 
    </children> 
</AnchorPane> 

Выход мой код выглядит следующим образом: enter image description here

Как вы можете видеть, что вычитали форма перемещается из исходное положение. Мне действительно нужно получить эту работу с FXML.

+0

Может быть полигоном, где две стороны соединены (соединены/соединены)? –

+0

Должно быть сделано прямо с Shape.subtract, но я не могу заставить его работать правильно. – Giannis

+0

Это может быть ошибка в JFX, если она не работает. Если вы не можете с этим справиться, пожалуйста, покажите код, с которым вы работаете. –

ответ

1

Shape.subtract должен работать нормально:

public class Test extends Application { 
    @Override 
    public void start(final Stage stage) throws Exception { 
     final Rectangle outer = new Rectangle(0,0,200,200); 
     final Rectangle inner = new Rectangle(50,50,100,100); 

     final Shape result = Shape.subtract(outer, inner); 
     result.setFill(Color.DODGERBLUE); 

     final Group group = new Group(); 
     group.getChildren().add(result); 

     stage.setScene(new Scene(group)); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     Application.launch(args); 
    } 
} 

Перечень выше производит результат, который вы хотите. Если это не сработает, отправьте сообщение об ошибке/скриншот результата.

+0

Обновлен вопрос с моим кодом. Ваш пример работает нормально, хотя кажется, что для FXML что-то нужно сделать другим. – Giannis

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