2014-05-02 4 views
0

Я пытаюсь создать ручку управления для JavaFX в этом примере в качестве отправной точки: http://fxexperience.com/2012/01/fun-javafx-2-0-audio-player/Не удалось загрузить кожу: нуль при применении CSS к FXML в сюжетном строитель

В этом примере они применяют кожу (KnobSkin. java) для слайдера в файле css.

Я создал пользовательский элемент управления, как это:

Knob.fxml

<?import java.lang.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.layout.AnchorPane?> 

<fx:root type="javafx.scene.layout.AnchorPane" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2"> 
    <children> 
    <AnchorPane id="myTestButton" layoutX="0.0" layoutY="5.0" minHeight="49.0" prefHeight="140.0" prefWidth="14.0"> 
     <children> 
     <Slider id="volume" orientation="VERTICAL" styleClass="knobStyle" /> 
     </children> 
    </AnchorPane> 
    </children> 
</fx:root> 

Knob.java

package application; 
public class Knob extends AnchorPane { 

    @FXML 
    private AnchorPane myTestButton; 

    public Knob() { 
     FXMLLoader fxmlLoader = new FXMLLoader(

     getClass().getResource("/application/Knob.fxml")); 

     fxmlLoader.setRoot(this); 
     fxmlLoader.setController(this); 

     try { 
      fxmlLoader.load(); 
     } catch (IOException exception) { 
      throw new RuntimeException(exception); 
     } 
    } 
} 

Моя главная сцена выглядит следующим образом:

испытания. fxml

<?import application.*?> 
<?import java.lang.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.layout.AnchorPane?> 
<?scenebuilder-classpath-element ../../bin?> 

<AnchorPane prefHeight="217.0" prefWidth="221.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2"> 
    <Knob layoutX="5.0" layoutY="4.0" /> 
</AnchorPane> 

При попытке открыть файл test.fxml в Scene Builder и применить этот CSS к нему:

.slider.knobStyle { 
    -fx-skin: "application.KnobSkin"; 
} 

Я получаю следующее сообщение об ошибке:

Не удалось загрузить кожу «StringProperty [боба: Slider [id = volume, styleClass = slider knobStyle], имя: skinClassName, значение: application.KnobSkin] 'для управления Slider [id = volume, styleClass = slider knobStyle]: null

Если я запустил приложение, отображается отлично.

Любая идея, что я сделал неправильно?

Спасибо!

ответ

2

После прочтения этого блога: http://www.guigarage.com/2012/11/custom-ui-controls-with-javafx-part-1/

Я обнаружил, что если я изменить свой класс Knob.java к

package application; 
public class Knob extends AnchorPane { 

    @FXML 
    private AnchorPane myTestButton; 

    public Knob() { 
     setSkinClassName(KnobSkin.class.getName()); 
    } 
} 

И я извлекаю Knob.fxml ручку будет отображаться в Scene Builder когда это Я выбираю свою таблицу стилей