私が書いているオプション アプリケーションのマークアップを単純化しようとしていたところ、いくつかの JavaFX コンポーネントをカスタム属性でサブクラス化することにしました。どうやらこれを行う方法は、私のインターフェイスのように、属性にゲッターとセッターを提供することです。
public interface ConfigNode {
public String getSection();
public void setSection(String section);
public String getKey();
public void setKey(String key);
public Wini getConfig();
public void setConfig(Wini config);
}
対応する fxml コード:
<GridPane fx:id="root" xmlns:fx="http://javafx.com/fxml" fx:controller="org.syntax_austria.league_config.OptionController" disable="true">
<ResolutionBox />
<QualityBox section="Performance" key="ShadowsEnabled" />
</GridPane>
ただし、これは機能せず、両方の属性が読み取り専用であることがわかります。
セッターがオブジェクトをパラメーターとして取り、それを試した例をいくつか見つけましたが、役に立ちませんでした。助けていただければ幸いです。
編集:尋ねられたので、ここに1人の実装者があります:
public class ModeBox<T> extends ChoiceBox<T> implements ConfigNode {
String section;
String key;
Wini config;
@Override
public String getSection() {
return section;
}
@Override
public void setSection(String section) {
if(section instanceof String)
this.section = (String)section;
}
@Override
public String getKey() {
return key;
}
@Override
public void setKey(String key) {
if(key instanceof String)
this.key = (String)key;
}
@Override
public Wini getConfig() {
return config;
}
@Override
public void setConfig(Wini config) {
this.config = config;
getSelectionModel().select(config.get(section, key, Integer.class));
getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observableValue, Number number, Number number2) {
getConfig().put(section, key, number2.intValue());
}
});
}
}
そしてそれを拡張するQualityBox:
public class QualityBox extends ModeBox<String> {
public QualityBox() {
setItems(FXCollections.observableArrayList("Very Low", "Low", "Medium", "High", "Very High"));
}
}