JavaFX子类化Button - 如何使Label更新工作?

时间:2015-06-15 21:33:06

标签: java javafx

我想要几个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。万一重要。

1 个答案:

答案 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 */
}