因此,我正在FXML中创建菜单,并且正在使用Group,因此我必须设置prefWidth,否则看起来很奇怪。为此,我想用控制器中的屏幕宽度初始化一个变量,然后在FXML中设置菜单时使用width变量。但是我只是找不到办法。
概括这个问题,我想在控制器中初始化一个变量,然后像这样在FXML中使用它:
[控制器]
package sample;
import javafx.fxml.Initializable;
import java.net.URL;
import java.util.ResourceBundle;
public class Controller implements Initializable {
@Override
public void initialize (URL url, ResourceBundle resourceBundle) {
String text = "test";
}
}
[FXML]
<?import javafx.scene.control.Label?>
<?import javafx.scene.BorderPane?>
<BorderPane>
<center>
<label text="<!--use var 'text' here-->"/>
</center>
</BorderPane>
我知道,还有其他方法可以做到这一点(例如对它进行ID设置并在控制器中设置文本),但是我只是想看看是否有可能这样做。
答案 0 :(得分:1)
使用属性代替变量。将其放在班级上。
public class Controller implements Initializable {
private String text; // or use binding property
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
@Override
public void initialize(URL location, ResourceBundle resources) {
text = "hello";
}
}
FXML
<BorderPane fx:controller="sample.Controller"
xmlns:fx="http://javafx.com/fxml">
<center>
<Label text="${controller.text}"/>
</center>
</BorderPane>
答案 1 :(得分:0)
FXMLLoader
可以将FXML中的属性绑定到控制器中的另一个属性。因此,您可以在控制器中定义属性,并使用其名称访问FXML。
控制器:
public class Controller implements Initializable {
private StringProperty title = new SimpleStringProperty(this, "title", "");
public final StringProperty titleProperty() {
return title;
}
public final void setTitle(String value) {
titleProperty().setValue(value);
}
public final String getTitle() {
return title.getValue();
}
@Override
public void initialize(URL location, ResourceBundle resources) {
setTitle("test");
}
}
FXML:
<BorderPane>
<center>
<label text="${controller.title}"/>
</center>
</BorderPane>
请注意,为了使FXMLLoader
创建绑定,属性应具有如示例中所示的变体和访问器。
答案 2 :(得分:0)
尝试绑定。
首先,在标签上放置一个id:
<Label fx:id="label" />
然后,在视图的Controller中声明它:
@FXML
private Label label;
现在,您必须为变量创建一个StringProperty:
private final StringProperty text = new SimpleStringProperty();
最后,添加绑定:
label.textProperty().bind(text);
text.set("test");