0

SkinJavaFXでCSS経由を定義する正しい場所はどこですか? 非常に単純なカスタム コントロールがあるとします...

public class ActionLink extends Control {
    private final StringProperty text = new SimpleStringProperty();
    public final StringProperty textProperty() {return text;}
    public final String getText() {return text.get();}
    public final void setText(String text) {this.text.set(text);}
}

コントロールでデフォルトのスキンを指定できることは知っています。私が持っていると仮定するとActionLinkSkin...

@Override
protected Skin<?> createDefaultSkin() {
    return new ActionLinkSkin(this);
}

を使用しないと、スキンが見つからないことを示す警告が表示されますcreateDefaultSkin()SEVERE

The -fx-skin property has not been defined in CSS for ActionLink@59ebabd \
  and createDefaultSkin() returned null.

まず、コントロールの CSS がどこに属しているかわかりません。コントロールにスタイルシートを使用する必要がありますか、それともaction-link.cssスキンにスタイルシートを使用する必要がありaction-link-skin.cssますか? 私には、スキンと CSS はかなり相互に依存しているように見えますが、コントロールにスタイルシートを使用する方が一般的であるようです。

-fx-skin第二に、私の主な問題は、正しく検出されるように定義する場所がわからないことです。

さて、CSS が正しく設定されていると仮定して、別のスキンを含めたい場合はどうすればよいActionLinkButtonSkinでしょうか? 親コンポーネントが CSS 経由でいずれかのスキンを選択できるように設定する方法はありますか? 例えば:

.action-link {
    -fx-skin: "ActionLinkSkin";
}

...また:

.action-link {
    -fx-skin: "ActionLinkButtonSkin";
}
4

1 に答える 1

0

ここで私が抱えていた問題はaction-link、自分のコントロールにスタイルを追加していなかったことです。これが私の単純なActionLinkコントロールの完全なバージョンです:

public class ActionLink extends Control {
    static {
        // Stylesheets is a custom class that resides alongside my CSS files
        // and returns properly externalized locations in a convention based
        // manner.
        StyleManager.getInstance().addUserAgentStylesheet(
            Stylesheets.byConvention(ActionLink.class)
        );
    }

    private final StringProperty text = new SimpleStringProperty();
    public final StringProperty textProperty() {return text;}
    public final String getText() {return text.get();}
    public final void setText(String text) {this.text.set(text);}

    public ActionLink() {
        getStyleClass().setAll("action-link");
    }
}
于 2015-02-04T23:41:11.883 に答える