2014-10-29 3 views
0

Я разместил несколько изображений на сцену, все указали на одно и то же изображение с различными окнами просмотра .JavaFX Scene Builder, несколько ImageViews с тем же изображением

генерироваться FXML:

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"> 
<children> 
    <ImageView fitHeight="150.0" fitWidth="200.0" layoutX="80.0" layoutY="91.0" pickOnBounds="true" preserveRatio="true"> 
     <image> 
      <Image url="@../../../../../Pictures/sas.png" /> 
     </image> 
     <viewport> 
      <Rectangle2D height="50.0" minY="50.0" width="50.0" /> 
     </viewport> 
    </ImageView> 
    <ImageView fitHeight="150.0" fitWidth="200.0" layoutX="308.0" layoutY="91.0" pickOnBounds="true" preserveRatio="true"> 
     <viewport> 
      <Rectangle2D height="50.0" minX="50.0" minY="50.0" width="50.0" /> 
     </viewport> 
     <image> 
      <Image url="@../../../../../Pictures/sas.png" /> 
     </image> 
    </ImageView> 
    <ImageView layoutX="225.0" layoutY="250.0"> 
     <image> 
      <Image url="@../../../../../Pictures/sas.png" /> 
     </image> 
    </ImageView> 
</children> 

Вопрос, будет ли это создать 3 экземпляров одного и того же изображения в памяти? Если да, то каковы наилучшие способы избежать этого, url ("") в атрибуте style, css class? Я бы хотел избежать создания класса css для каждого отдельного значка!

Возможно ли использовать одно крупное изображение с обрезкой для нескольких значков & Элементы пользовательского интерфейса вместо небольшого изображения для каждого в этот день & Возраст?

ответ

1

Быстрый тест показывает, что ImageView s не ссылаются на то же самое Image в памяти.

Чтобы сделать это, вы можете либо использовали CSS, как вы описали, или вы можете определить Image раз в FXML с <fx:define> блока и ссылаться на него через его fx:id атрибута:

<fx:define> 
    <Image url="@../../../../../Pictures/sas.png" fx:id="sasImage" /> 
</fx:define> 
<ImageView image="$sasImage" fitHeight="150.0" fitWidth="200.0" layoutX="80.0" layoutY="91.0" pickOnBounds="true" preserveRatio="true"> 
    <viewport> 
     <Rectangle2D height="50.0" minY="50.0" width="50.0" /> 
    </viewport> 
</ImageView> 
<ImageView image="$sasImage" fitHeight="150.0" fitWidth="200.0" layoutX="308.0" layoutY="91.0" pickOnBounds="true" preserveRatio="true"> 
    <viewport> 
     <Rectangle2D height="50.0" minX="50.0" minY="50.0" width="50.0" /> 
    </viewport> 
</ImageView> 
<ImageView image="$sasImage" layoutX="225.0" layoutY="250.0"> 
</ImageView> 
+0

Ах, я ответил термины FXML: я не уверен, поддерживает ли SceneBuilder ''. –

+0

Неполадка заключается в том, что файл не читается файлом сценария, который может быть утомительным в больших проектах. Поэтому придерживаться CSS, вероятно, правильный путь. –

+0

Единственным недостатком подхода css является то, что он не устанавливает свойство 'image' на' ImageView'. Поэтому, если вам нужно было получить изображение позже в контроллере с помощью 'ImageView.getImage()', вы бы не смогли; подход '' позволяет это. Вероятно, стоит указать [запрос функции] (https://javafx-jira.kenai.com/secure/Dashboard.jspa) для '' поддержки в SceneBuilder. –

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