我想要几个JavaFX按钮,用我的文本更新我的应用程序中的一个Label。出于测试目的,它只是按钮文本。
我最初做的很好,看起来像这样:
String Text = "...";
public void kons() {
System.out.println("Works...");
System.out.println(Text);
Tekst.setText(Text);
Button G4 = new Button("Spadantes");
G4.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
Text = G4.getText();
kons();
}
});
然后我决定使用CSS来设置我的按钮样式,因为我想以不同的方式设置几组按钮,我以这种方式将JavaFX Button类子类化:
public class Buttons extends Button {
public Buttons(String text) {
super(text);
getStylesheets().clear();
getStylesheets().add("./Buttons.css");
哪个仍然奏效。但现在我希望将我的事件处理程序移动到Button子类(以避免将完全相同的代码复制粘贴到我的每个按钮中)。我做的是这样的:
public class Buttons extends Button {
public Buttons(String text) {
super(text);
getStylesheets().clear();
getStylesheets().add("./Buttons.css");
setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
Main.Text = getText();
Main.kons();
}
});
}
}
主要是我的扩展应用程序类
Tekst是我的标签。
遗憾的是,它抛出了从静态上下文中调用非stathic方法和变量的异常。据我所知,实例是静态的,定义是非静态的。我试图改变一切&#34;顺便说一下&#34;静态但它在点击按钮后给了我红墙错误(编译过程中没有任何内容)。我也尝试以某种方式调用我的应用程序的实例,但我不知道如何(从我的理解扩展Application类在启动程序时自己实现它自己,所以没有&#34; name&#34 ;我可以称之为标签。
我正在寻找的是快速而肮脏的解决方案&#34;能够使用子类化按钮(或其他滑块,文本字段等),可以在屏幕上调用更新内容的方法&#34;。
[编辑]我当然使用最新的Java。万一重要。
答案 0 :(得分:1)
为什么不编写一个为您创建按钮的实用程序方法,而不是子类化?我也不建议将text
变量作为实例变量:只需直接引用Label
。
public class SomeClass {
private Label tekst ;
// ...
private Button createButton(String buttonText) {
Button button = new Button(buttonText);
button.getStylesheets().add("Buttons.css") ;
button.setOnAction(e -> tekst.setText(buttonText));
return button ;
}
}
然后,在同一个班级中,当你需要其中一个按钮时,你就可以了
Button button = createButton("Text");
如果你真的想要子类(这对我来说似乎没用),你需要将对标签的引用传递给子类:
public class LabelUpdatingButton extends Button {
public LabelUpdatingButton(String text, Label labelToUpdate) {
super(text);
getStylesheets().add("Buttons.css");
setOnAction(e -> labelToUpdate.setText(getText()) );
}
}
然后从你的类中组装你可以做的UI
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
Label tekst = new Label();
Button someButton = new LabelUpdatingButton("Button text", tekst);
// etc...
}
}
但同样,创建一个除了定义调用公共API方法的构造函数之外什么都不做的子类是多余的,imo。
另外,为您的按钮创建一个完整的样式表有点不寻常。通常,您会在Button
上设置样式类:
button.getStyleClass().add("my-button-class");
然后在您添加到Scene
的样式表中执行
.my-button-class {
/* styles for this type of button */
}