2015-07-17 2 views
2

Если узел имеет fx: id (скажем, а), а также обычный id (css id) (скажем, b). Если поиск используется для поиска этого узла:java fx: метод поиска сцены

узел узла = scene.lookup («# а»)

выше оператор возвращает нуль. Но если в обсуждении нет идентификатора css, соответствующего указанному узлу, то вышеприведенный оператор возвращает правильный узел.

При использовании ниже данное утверждение всегда возвращает правильный результат:

узел узла = scene.lookup («# б»)

Может кто-нибудь, пожалуйста, объясните, почему поиск метод ведет себя так странно?

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

<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.geometry.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.image.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.paint.*?> 
<?import javafx.scene.text.*?> 

<GridPane hgap="14.0" maxHeight="+Infinity" maxWidth="+Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="223.0" prefWidth="323.0" vgap="20.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"> 
    <children> 
    <VBox maxHeight="+Infinity" maxWidth="+Infinity" minHeight="-Infinity" spacing="7.0" GridPane.rowIndex="0"> 
     <children> 
      <HBox alignment="TOP_RIGHT"> 
       <children> 
       <Label fx:id="headerMessage" text="message" textAlignment="LEFT" wrapText="true"> 
       <font> 
        <Font name="System Bold" size="13.0" /> 
       </font> 
       </Label> 
       </children> 
      </HBox> 
      <HBox alignment="TOP_RIGHT" spacing="5.0"> 
       <children> 
       <Label fx:id="qty" text="details" textAlignment="LEFT" wrapText="true"> 
       <font> 
        <Font size="12.0" /> 
       </font> 
       </Label> 
        <TextField fx:id="qtyT" /> 
       </children> 
      </HBox> 
      <HBox alignment="TOP_RIGHT" spacing="5.0"> 
       <children> 
        <Label fx:id="name" text="details" textAlignment="LEFT" wrapText="true"> 
        <font> 
         <Font size="12.0" /> 
        </font> 
        </Label> 
        <TextField fx:id="nameT" /> 
       </children> 
      </HBox> 
      <HBox alignment="TOP_RIGHT" spacing="5.0"> 
       <children> 
        <Label fx:id="remarks" text="details" textAlignment="LEFT" wrapText="true"> 
        <font> 
         <Font size="12.0" /> 
        </font> 
        </Label> 
        <TextArea fx:id="remarksT" prefHeight="60.0" prefWidth="149.0" wrapText="true" /> 
       </children> 
      </HBox> 
     </children> 
    </VBox> 
    <HBox maxHeight="-Infinity" maxWidth="+Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="25.0" prefWidth="253.0" GridPane.rowIndex="1"> 
     <children> 
     <Pane maxWidth="+Infinity" HBox.hgrow="ALWAYS" /> 
     <Button id="cancel-button" fx:id="cancelButton" cancelButton="true" minWidth="80.0" mnemonicParsing="false" text="Cancel" HBox.hgrow="NEVER"> 
      <HBox.margin> 
      <Insets /> 
      </HBox.margin> 
     </Button> 
     <HBox fx:id="okParent" alignment="CENTER"> 
      <children> 
      <Button id="ok-button" fx:id="okButton" minWidth="80.0" mnemonicParsing="false" text="Ok" HBox.hgrow="NEVER"> 
       <HBox.margin> 
       <Insets left="14.0" /> 
       </HBox.margin> 
      </Button> 
      </children> 
     </HBox> 
     </children> 
    </HBox> 
    </children> 
    <columnConstraints> 
    <ColumnConstraints halignment="CENTER" hgrow="ALWAYS" maxWidth="+Infinity" minWidth="-Infinity" /> 
    </columnConstraints> 
    <padding> 
    <Insets bottom="14.0" left="14.0" right="14.0" top="14.0" /> 
    </padding> 
    <rowConstraints> 
    <RowConstraints maxHeight="+Infinity" minHeight="-Infinity" valignment="CENTER" vgrow="ALWAYS" /> 
    <RowConstraints maxHeight="-Infinity" minHeight="-Infinity" vgrow="NEVER" /> 
    </rowConstraints> 
</GridPane> 

В приведенном выше FXML, поиск работает отлично на FXML идентификаторов для узлов, которые не имеют какой-либо CSS идентификатора. Если присутствует css id, то он возвращает нули

Label headerMessage = (Label) alertStage.getScene().lookup("#headerMessage"); 
       final TextField qty = (TextField) alertStage.getScene().lookup("#qtyT"); 
       Label name = (Label) alertStage.getScene().lookup("#name"); 
       final TextArea remarksT = (TextArea) alertStage.getScene().lookup("#remarksT"); 
       final TextField nameT = (TextField) alertStage.getScene().lookup("#nameT"); 

Метод поиска не работает только для данного ниже описания.

Button okButton = (Button) alertStage.getScene().lookup("#okButton"); 
+1

Это странно. Я уверен с 'fx: id', он всегда должен возвращать' null'. Можете ли вы добавить [MCVE] (http://stackoverflow.com/help/mcve), изображающие это поведение? – ItachiUchiha

ответ

2

Редактировать - После того, как OP добавил MCVE

копания в материю. Я получил простую инструкцию, написанную глубоко внутри документации FXML, которая объясняет поведение. Фактически, fx: id назначается как default id элемента управления/компоновки, вызывая setId().

Если не переопределено, fx:id остается в качестве default id объекта.

От Introduction To FXML:

Назначение Fx: значение идентификатора элемента создает переменное в пространстве имен документа, которые впоследствии могут быть отнесены к переменным разыменованием атрибуты, такие как атрибут «toggleGroup», показанной выше, или в коде сценария, обсуждаемом в более позднем разделе. Кроме того, если тип объекта определяет свойство «id», это значение также будет передано методу setId() объектов.

The lookup() делает свою работу отлично и работает на CSS selectors и не на fx:id.