Java 更改按钮单击时的变量-或一般事件中的变量

Java 更改按钮单击时的变量-或一般事件中的变量,java,javafx,Java,Javafx,问题介绍 在一个事件中(比如button.setOnAction(e->{x=x+2});)不可能更改一个可验证项,我知道原因,但如果这正是我需要的呢?实际上,这不是我第一次需要这样做,但上一次我通过将更改的属性直接保存到一个文件来解决这个问题。 这一次,我使用了一个非常棘手的技巧,通过使用invisibe文本字段中的文本作为我的可验证文件来创建一个“伪变量”。它是有效的,这不是问题,但我想有一个更“优雅”的称呼:d 我的研究成果 我能找到的唯一两个称呼是要么声明一个变量作为类成员(我不想这样做

问题介绍
在一个事件中(比如
button.setOnAction(e->{x=x+2});
)不可能更改一个可验证项,我知道原因,但如果这正是我需要的呢?实际上,这不是我第一次需要这样做,但上一次我通过将更改的属性直接保存到一个文件来解决这个问题。
这一次,我使用了一个非常棘手的技巧,通过使用invisibe文本字段中的文本作为我的可验证文件来创建一个“伪变量”。它是有效的,这不是问题,但我想有一个更“优雅”的称呼:d

我的研究成果
我能找到的唯一两个称呼是要么声明一个变量作为类成员(我不想这样做,因为我已经有六个变量了,不想让这个数量翻三倍),要么使用单独的类。(我在这里发现:)

节目
这是我的弹出窗口的代码(我将为您省去我的其他愚蠢程序^^^),我将解释它在代码框之后的作用。(请注意,
props
是一个属性对象,是所提到的类成员之一,也是
propPath
(这意味着我在程序的最顶端声明了它,以便可以从每个函数访问它):

我想在那里贴一张照片,上面是你启动后的样子,另一张是你使用后的样子,但我的声誉仍然很低^^
因此,我将提供这些图片的链接:在使用之前或之后

程序的功能
事实上,这很简单:我的主要程序是一个角色表,通过弹出窗口,你可以添加一个buff(稍后我会制作它,以便将buff的效果计算到sheed的值中,但一步一步^)。您可以设置要创建的buff的名称(“未知buff”是您忘记设置buff的标准),然后只需将tem写入文本字段,然后按下“添加”按钮,即可添加不同的效果。他们将在自由空间中自上而下列出自己。他们还将在幕后将自己作为一个大字符串保存到一个隐藏的文本字段中,以确定每个单独的效果必须显示在哪一行,然后将其保存到属性文件中。(这种带有未显示文本字段的问候语正是我想要去掉的技巧,并转变为更“优雅”的问候语)

代码的详细解释
首先,创建阶段。然后,以网格窗格的形式进行布局,并设置列大小(出于间距原因,每隔一列)。在这之后,我将为名称(标签和文本字段)以及用作字符串变量的复杂文本字段创建一行。现在,我正在创建effect textfield和add按钮,以及按钮的事件:首先,它将来自textfield的输入转换为一个更易于阅读的名称,并将其拆分为各个组件(首先,我在下面的代码中使用了
tfEffect.getText()
tfEffect.getText().split(“”
),但这确实很混乱)现在我有if语句来验证它,并确保效果的格式正确(该格式表示某个统计数据的上升或下降量,在开始处由加号或减号组成,然后是数字;后面是空格,然后是统计数据的索引)(我还无法实现验证键入的东西是否是有效的stat,也许这将是未来问题的内容;D))。在验证程序后,它会将效果添加到所有其他效果之下。如果您完成并对自己的buff感到满意,则可以单击“完成”按钮,它将首先查找已存在的buff数量,然后将新的buff分配给一个数字,并将其全部保存到属性文件中。当然,取消按钮只是取消它,在底部,我设置在舞台上表演并呼叫舞台

我对这个问题的期望是什么
现在我想你已经非常清楚我需要做什么,为什么我找不到比使用隐藏文本字段作为变量更好的称呼,我希望这是因为我是一个初学者,而不是因为实际上没有更好的方法来做它^^

此外,如果你真的阅读了所有这些内容,你可能会发现除此之外还有一两件事我可以改进,但这将是一个特别的好处;D

你可以通过使用一个类来保存你的状态,例如
类状态{int x;}
,以及该类的一个实例:
状态=新状态()然后,在你的lambda中:
e->state.x=state.x+2
。之所以有效,是因为对
state
的引用的值被传递给lambda,而不是
state.x
@Andy的值。这是个好主意,谢谢!我会看看是否使用它!最后我会有一个包含几十个变量的独立类是的,但至少它是有效的:D问题是,这是否真的那么优雅,但我想说的是,至少有一点,拥有一个(或多个)代表所有状态的类并引用它可能是可取的:它在UI设计中被称为“模型”。如果你听说过“MVC”或“MVP”,那么这个模型就是“M”在那些设计模式中。@James哇,这很有趣(我很快用谷歌搜索了它^^),谢谢!@AndyTurner顺便问一下,你想把你的评论作为答案发布吗?这正是我所做的(如果我记得正确的话),我不能将评论标记为接受的答案(显然)您可以使用一个类来保存您的状态,例如
类状态{int x;}
,以及该类的一个实例:
状态=新状态()然后,在lambda中:
e->state.x=state.x+2
。工作的原因是对
state
的引用的值传递给lambda,而不是
state.x
private void createNewBuff() throws Exception {
    Stage popupStage = new Stage(StageStyle.UTILITY);
    popupStage.initModality(Modality.APPLICATION_MODAL);
    popupStage.setTitle("Creating a new Buff");
    popupStage.setMinWidth(400);
    popupStage.setMinHeight(300);

    GridPane layoutGP = new GridPane();
    layoutGP.getColumnConstraints().addAll(
            new ColumnConstraints(200),     //TextField column    col 0
            new ColumnConstraints(10),      //Gab column         col 1
            new ColumnConstraints(60),      //tf manips column    col 2
            new ColumnConstraints(30),      //Gab column         col 3
            new ColumnConstraints(80));     //Main buttons col    col 4

    TextField tfName = new TextField("Unknown Buff");
    tfName.setPromptText("Name of the Buff, e.g. \"Unknown Buff\"");
    Label lblName = new Label("Name");
    layoutGP.add(tfName, 0, 0);
    layoutGP.add(lblName, 2, 0);
    TextField varTF = new TextField();

    TextField tfEffect = new TextField();
    tfEffect.setPromptText("Effect of the Buff, e.g. \"+10 LP\"");
    Button btnAdd = new Button("Add");
        btnAdd.setOnAction(e -> {
            String input = tfEffect.getText();
            String[] comps = input.split(" ");  //components
            if (Array.getLength(comps) == 2) {
                if (input.contains("+")) {
                    varTF.setText(varTF.getText() + input + ";");
                    layoutGP.add(new Label(input), 0, 1 + Array.getLength(varTF.getText().split(";")));
                } else if (input.contains("-")) {
                    varTF.setText(varTF.getText() + input + ";");
                    layoutGP.add(new Label(input), 0, 1 + Array.getLength(varTF.getText().split(";")));
                }
            }
        });
    layoutGP.add(tfEffect, 0, 1);
    layoutGP.add(btnAdd, 2, 1);


    Button btnDone = new Button("Done");
        btnDone.setOnAction(e -> {
            int buffNumber = 1;
            while (props.containsKey("Buff-" + buffNumber + "-name"))
                buffNumber++;
            props.setProperty("Buff-" + buffNumber + "-name", tfName.getText());
            props.setProperty("Buff-" + buffNumber + "-effect", varTF.getText());
            try {
                FileOutputStream streamOut = new FileOutputStream(propPath);
                props.store(streamOut, null);
                streamOut.close();
                popupStage.close();
            }catch (IOException someE){/*something meaningful*/}
        });
        btnDone.setMaxWidth(Double.MAX_VALUE);
    Button btnCancel = new Button("Cancel");
        btnCancel.setOnAction(e -> popupStage.close());
        btnCancel.setMaxWidth(Double.MAX_VALUE);
    layoutGP.add(btnDone, 4, 0);
    layoutGP.add(btnCancel, 4, 1);

    layoutGP.setAlignment(Pos.TOP_CENTER);
    Scene popupScene = new Scene(layoutGP);
    popupStage.setScene(popupScene);
    popupStage.showAndWait();
}