问题简介
它不可能在事件中改变Veriable(例如button.setOnAction(e -> { x = x+2});
),我可以看到原因,但是如果这正是我需要的呢?实际上这不是我第一次需要这样做,但上次通过将更改后的属性直接保存到文件中来解决这个问题。
这次我使用一个非常棘手的技巧来创建一个'假变量',使用invisibe TextField中的文本作为我的可靠。它有效,这不是问题,但我希望有一个更“优雅”的问题:D
我的研究成果
我能找到的唯一两个问题是要么将一个变量声明为一个类成员(我不想看到我已经有六个并且不想要达到这个数量)或者使用单独的类。 (我在这里发现:How to change a variable when a button has been clicked in JavaFx)
该程序
这是我的弹出窗口的代码(我将省去你剩下的愚蠢程序^^),我将解释它在代码框后的作用。 (注意props
是一个属性对象,也是提到的类成员之一以及propPath
(意思是我在程序的最顶层声明它,以便可以从每个函数访问它)) :
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();
}
我想张贴一张图片,一旦你开始它就会看起来如何,另外一张你用它后的样子,但我的名声仍然很低^^
因此,我将提供图片链接:完成某些事情http://i.imgur.com/Wx3nIEX.png使用完毕后http://i.imgur.com/5QNmWP6.png
该计划的作用
实际上它是相当直接的前进:我的主程序是一个角色表,你可以在弹出窗口添加一个buff(稍后我会做到这样,以便buff的效果计算到sheed的值,但一步一次^^)。你可以设置你想要创建的buff的名称(“Unknown Buff”是你忘记设置它的标准)然后你可以通过将tem写入TextField然后按下“Add”按钮来添加不同的效果。他们将在自由空间中从上到下列出自己。他们还将在幕后将自己保存为隐藏的TextField中的一个大字符串,以便确定每个效果必须显示在哪一行,然后将其保存到属性文件中。 (并且使用未显示的文本字段进行处理正好是我想删除的技巧,并变成更“优雅”的语言)
详细解释代码
首先创建舞台。然后布局以网格窗格的形式进行,并且设置列大小(每隔一列用于间隔原因)。之后,我正在为名称(标签和文本字段)创建行,还有我用作String变量的棘手文本字段。现在我正在创建效果文本字段并添加按钮,以及按钮的事件:首先它将文本字段中的输入转换为更易于阅读的名称并将其拆分为其组件(起初我使用{{1在下面的代码中,并且tfEffect.getText()
,但这真的很乱)现在我有if语句来验证它并确保效果是正确的格式(该格式是某个统计数据被提出的数量或者lowerd,由开头的加号或减号以及后面的数字组成;后跟一个空格,然后是stat的索引(我无法实现验证输入的东西是否真的是有效的stat ,也许这将是未来问题的内容; D))。验证程序后,它会将效果添加到所有其他程序之下。如果你已经完成并且对你的buff很满意你可以点击完成按钮,它将首先查找已存在的Buff数量,然后在数字上分配新数据并将其全部保存到属性文件中。取消按钮当然只是取消它,在底部我正在设置场景并调用舞台。
我对此问题的期望
现在我觉得你已经清楚地知道我需要做什么以及为什么我找不到更好的问题,然后使用隐藏的TextField作为变量,我希望这是因为我是初学者而不是因为实际上没有更好的方式做到这一点^^
此外,如果你真的读了所有这些,你可能会找到一两件我可以改进的东西,但那将是特殊的奖励; D