JavaFX Control mit eigenem Skin implementieren

lazydog

Mitglied
Hallo,

ich möchte gerne ein Control mir eigenem Skin bauen. Laut Oracle Doku müsste das eigentlich auf Basis einer Konstruktion wie der folgenden gehen:

1. Stylesheet: mystyles.css
CSS:
.mycontrol{
   -fx-skin: "MySkin";
}

2. Control: MyControl
Java:
import javafx.scene.control.Control;

public class MyControl extends Control{
   
  public MyControl(){
     getStylesheets().add("mystyles.css");
     getStyleClass().add("mycontrol");
   }

}

3. Skin: MySkin
Java:
import javafx.scene.control.SkinBase;

public class MySkin extends SkinBase{

   protected MySkin(MyControl ctrl) {
     super(ctrl);
   }
   
}

4. Application: MyApplication
Java:
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class MyApplication extends Application{

   @Override
   public void start(Stage stage) throws Exception {
  Scene scene = new Scene(new Group(),500,400);
     stage.setScene(scene);
     stage.show();
     MyControl mt = new MyControl();
     ((Group) scene.getRoot()).getChildren().addAll(mt);
   }

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

}

Dies produziert allerdings folgenden Fehler:

Aug 09, 2014 2:43:29 PM javafx.scene.control.Control loadSkinClass
SEVERE: No valid constructor defined in 'MySkin' for control MyControl@79addb1d[styleClass=mycontrol].
You must provide a constructor that accepts a single Skinnable (e.g. Control or PopupControl) parameter in MySkin.

In den Oracle Docs steht nichts Erhellendes dazu und im Netz ist auch nichts zu finden. Hat vielleicht hier schon mal jemand so etwas gemacht oder kann mir sonstwie auf die Sprünge helfen?

vielen Dank für jeden Tipp!
ld
 

ComFreek

Mod | @comfreek
Moderator
Hallo,

ich habe damit noch nicht gearbeitet, aber laut diesem Artikel und laut der Fehlermeldung sollte deine Klasse "MySkin" einen öffentlichen Konstruktor haben, der ein Control-Objekt annimmt.

Also ändere mal protected zu public um.