当前位置: 首页 > 知识库问答 >
问题:

JavaFX子类按钮-如何使标签更新工作?

岑炯
2023-03-14

我希望有几个JavaFX按钮,用文本更新应用程序中的一个标签。出于测试目的,它只是按钮文本。

我一开始做的很好,看起来是这样的:

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是我的标签。

可悲的是,它给我带来了从静态上下文调用非静态方法和变量的例外。据我所知,实例是静态的,定义是非静态的。我试图改变一切的方式静态,但它给我的红墙的错误点击按钮后(没有在编译过程中)。我也试图以某种方式调用我的应用程序的实例,但我不知道如何(从我所理解的扩展应用程序类intantiates自己,而启动程序,所以没有名称,我可以称之为它的标签。

我正在寻找的是“快速而肮脏的解决方案”,能够使用子类按钮(或其他滑块、文本字段等),调用“屏幕上”更新内容的方法

[编辑]我使用的当然是最新的Java。以防万一。

共有1个答案

孔礼骞
2023-03-14

与其子类化,为什么不编写一个实用方法来为您创建按钮呢?我也不建议将文本变量作为实例变量:直接引用标签

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.getStyleClass().add("my-button-class");

然后在样式表中添加到场景do

.my-button-class {
    /* styles for this type of button */
}
 类似资料:
  • RootController类是我需要进行工作的地方。在方法private void handleDelete()中,您可以在注释中看到一些代码,这是一个工作代码,但我无法找到从ContentController类加载数据的方法,这是上面的代码垃圾。 我将感谢任何关于如何使它工作的想法。

  • 我对javafx和场景构建器非常陌生。当单击按钮时,我试图创建一个新标签。以下是按钮创建标签的方法: 但它不起作用:(是否因为我没有在fxml中创建lbl1?是否可以在java代码中创建标签而不在fxml中创建?请帮助我!

  • 下面是使用引导模板的单选按钮组的代码片段。但我试图做的是每次切换选项时更改单选按钮的类部分(即选中单选按钮时,标签类将为“btn btn primary”,如果未选中,标签类将为“btn btn default”)。有人知道如何做到这一点吗?

  • 当我想用帖子的现有标签编辑帖子时,它只显示一个标签,尽管所选帖子中有更多标签。我还想在后期编辑刀片中输入新标签。 后期创建代码 **post控制器中的post更新代码** **后期编辑刀片的标签代码**

  • 本文向大家介绍如何使用JavaScript更改警报框中的按钮标签?,包括了如何使用JavaScript更改警报框中的按钮标签?的使用技巧和注意事项,需要的朋友参考一下 使用标准警报框,您无法更改按钮标签。要更改标签,请使用自定义警报框。在这里,警报框的“确定”更改为“谢谢您的通知!” 例如:

  • 我有一个FXML文档,其中包含我的JavaFX项目的视觉基础,我想通过使用一个窗格来创建一个自己的Topbar(X、最小值/最大值等等)。但我的程序将有多个页面(场景),为了保持代码干净,我想将自定义Topbar作为一个单独的类(有点像组件对象)。我只是不知道该如何在我使用的FXML基础上实现这个类(我使用的是Scene Builder)。