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

JavaFX如何用按钮改变文本节点?

司英彦
2023-03-14

我正在制作一个计算器。到目前为止,我已经创建了几个类。有一个IntegerButton,当它被按下时,应该在监视器上显示它的值。

package calculator.buttons;

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Button;

public class IntegerButton extends Button{
    int value;

    public IntegerButton(int value) {
        this.value = value;
        this.setText(Integer.toString(value));
        this.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
//                Handle the event as an integer
//                send event to monitor?
            }
        });
    }

}

但是,我不明白如何做到这一点。

当我在每个按钮的构造函数中定义句柄(ActionEvent事件)时,我无法引用监视器。此外,我完全迷失了EventHandler的概念。我的监视器应该监听事件吗?我的Button是否应该在start(舞台初选阶段)方法中调用它的setOnAction?我完全不知所措。

下面是我的应用的启动方法:包计算器;

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.RowConstraints;
import javafx.stage.Stage;

/**
 *
 * @author souten
 */
public class Calculator extends Application {

    public static final double MIN_HEIGHT = 525;
    public static final double MIN_WIDTH = 350;
    public static final double DEFAULT_GAP = 6;

    @Override
    public void start(Stage primaryStage) {
//        Window settings
        primaryStage.setTitle("Calculator");
        primaryStage.setMinHeight(MIN_HEIGHT);
        primaryStage.setMinWidth(MIN_WIDTH);

//        container is the base content node
//        - it contains 1 column and 3 rows
        GridPane container = new GridPane();
        container.setAlignment(Pos.CENTER);
        ColumnConstraints column1 = new ColumnConstraints();
        column1.setPercentWidth(100);
        container.getColumnConstraints().add(column1);
        RowConstraints[] rows = new RowConstraints[3];
        for (int i = 0; i < rows.length; i++)
            rows[i] = new RowConstraints();
        rows[0].setPercentHeight(40);
        rows[1].setPercentHeight(10);
        rows[2].setPercentHeight(50);
        container.getRowConstraints().addAll(rows);
        container.setHgap(0);
        container.setVgap(DEFAULT_GAP);

//        row 0: the monitor, outputs the calculations in hex, dec, oct, and bin

        Monitor m = new Monitor();
        container.add(m, 0, 0);

//        row 1: contains misc buttons i.e. bit-toggler, bit measurement, and memory buttons

//        row 2: the bottom row, keypadContainer contains all the buttons that create the calculation/function

        Keypad keypad = new Keypad();
        container.add(keypad, 0, 2);

//        Scene initialization
        Scene scene = new Scene(container, MIN_WIDTH, MIN_HEIGHT);
        primaryStage.setScene(scene);
        scene.getStylesheets().add
          (Calculator.class.getResource("Calculator.css").toExternalForm());
        primaryStage.show();
    }

    /** 
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

键盘类别:

package calculator;

import calculator.buttons.IntegerButton;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;

public class Keypad extends GridPane{
    String[][] labels = {
        {"Lsh", "Rsh", "Or", "Xor", "Not", "And"},
           {"↑", "Mod", "CE", "C", "⌫", "÷"},
             {"A", "B", "7", "8", "9", "×"},     
             {"C", "D", "4", "5", "6", "−"},
             {"E", "F", "1", "2", "3", "+"}, 
             {"(", ")", "±", "0", ".", "="}
    };

    Button[][] buttons = new Button[6][6];

    public Keypad(){
        //        initialize buttons
        buttons[5][3] = new IntegerButton(0);
        buttons[4][2] = new IntegerButton(1);
        buttons[4][3] = new IntegerButton(2);
        buttons[4][4] = new IntegerButton(3);
        buttons[3][2] = new IntegerButton(4);
        buttons[3][3] = new IntegerButton(5);
        buttons[3][4] = new IntegerButton(6);
        buttons[2][2] = new IntegerButton(7);
        buttons[2][3] = new IntegerButton(8);
        buttons[2][4] = new IntegerButton(9);
        for (int i = 0; i < 6; i++){
            for (int j = 0; j < 6; j++) {
            if(buttons[i][j] != null)
                this.add(buttons[i][j], j, i);
            }
        }


    }

}

和我的监视器类:

package calculator;

import javafx.scene.text.Text;

public class Monitor extends Text {


    public Monitor() {
        this.setText("Hello World!");
//      this.addListener?
    }
}

基本上,我对如何通过事件连接这些节点有一个基本的误解。怎么做?

共有1个答案

阎安邦
2023-03-14

这是一个非常基本的例子,它说明了一个按钮事件在你试图使用它的上下文中是如何工作的。

public class SimpleButtonApp extends Application {

@Override
public void start(Stage stage) throws Exception {
    GridPane container = new GridPane();

    Label displayLabel = new Label();

    String[][] labels = {
            {"Lsh", "Rsh", "Or", "Xor", "Not", "And"},
               {"↑", "Mod", "CE", "C", "⌫", "÷"},
                 {"A", "B", "7", "8", "9", "×"},     
                 {"C", "D", "4", "5", "6", "−"},
                 {"E", "F", "1", "2", "3", "+"}, 
                 {"(", ")", "±", "0", ".", "="}};

    for(int i = 0; i < labels.length; i++) {
        for(int j = 0; j < labels[i].length; j++) {
            String label = labels[i][j];

            Button button = new Button(label);
            button.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    displayLabel.setText(displayLabel.getText() + label);
                }
            });
            container.add(button, i, j);
        }
    }

    container.getChildren().addAll(button, displayLabel);
    Scene scene = new Scene(container, 300, 100);
    stage.setScene(scene);
    stage.show();
}

public static void main(String[] args) {
    launch(args);
}
}

制作计算器的一些设计提示:

1) 一个基本的JavaFX标签应该可以用来显示数字

2)不需要IntegerButton类。按钮只是一个按钮。

3)您的事件处理程序应该在您可以访问按钮和标签的地方定义

 类似资料:
  • 问题内容: 我正在尝试使用以下代码设置按钮文本: 这是我的FXML: 但这行不通,我不明白为什么,还有其他人知道如何使用JavaFX设置按钮文本吗?>。>; 我觉得JavaFX不像Swing那样简单…但是无论如何,有人知道我在做什么错吗?另外,有没有人知道有什么资源可以学习FXML?我喜欢FXML而不是用Java进行编码,但是似乎没有太多的东西,我是否是世界上唯一喜欢FXML而不是JavaFX G

  • 在我的程序中,我有两个按钮:第一个改变框架背景,第二个改变按钮背景(只为自己)。重点是程序应该为程序中的每个按钮改变按钮背景(不仅仅是为它自己)。我应该怎么重写对话框?

  • 我正在使用javaFX。我做了一个按钮并为此设置了一个图像。代码是: 但是我想当我点击按钮时,图像会变成另一张图片。我该怎么做呢?

  • 我是JavaFx新手,我正在尝试创建一个简单确认框类,用于确定用户是否真的想要退出。它有一个返回布尔值的函数,表示用户单击“是”或“否”: 我试着让“答案”变得不稳定,但这并没有改变任何事情。

  • 我正在用javaFX在netbeans中编写一个程序视图中有几个按钮和一些坏按钮(比如炸弹是扫雷舰),我试图在按下坏按钮时冻结程序,但我找不到如何操作 谢谢

  • 主要内容:创建按钮,按钮内容,按钮操作,按钮效果,按钮样式,按钮鼠标事件当用户单击按钮时,JavaFX 类可以触发事件。类扩展了类,可以显示文本,图像或两者都可以。 以下代码显示了如何向添加单击操作侦听器。 上面的代码生成以下结果。 创建按钮 我们使用以下构造函数在JavaFX中创建一个。 创建带有空文本标题的按钮。 创建具有指定文本的按钮。 要创建带有文本和图标的按钮。 按钮内容 创建JavaFX 对象后,我们可以使用以下方法设置文本并设置安装图标。 - 设置按钮的