Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javafx如何根据在次场景中所做的更改更改/刷新主场景及其控件?_Java_Javafx - Fatal编程技术网

javafx如何根据在次场景中所做的更改更改/刷新主场景及其控件?

javafx如何根据在次场景中所做的更改更改/刷新主场景及其控件?,java,javafx,Java,Javafx,我要做的是,在切换回主场景时,在次场景中进行更改,以填充主场景中的控件。下面显示的代码详细说明了我尝试执行的操作的简化版本。在我的主要场景中,我有4个带有姓名的复选框,例如,有人从这些姓名中选择邀请他们参加聚会。但是我在底部添加了一个编辑按钮,它会将用户带到第二个场景,在那里他们可以向列表中添加一个新字符串,该列表创建了最初的4个复选框。切换回主场景时,我希望新名称出现在复选框中。我意识到我必须彻底重新思考/修改我的代码,但我想不出一种方法来做到这一点。这可能吗?有人能帮忙吗 // EditSc

我要做的是,在切换回主场景时,在次场景中进行更改,以填充主场景中的控件。下面显示的代码详细说明了我尝试执行的操作的简化版本。在我的主要场景中,我有4个带有姓名的复选框,例如,有人从这些姓名中选择邀请他们参加聚会。但是我在底部添加了一个编辑按钮,它会将用户带到第二个场景,在那里他们可以向列表中添加一个新字符串,该列表创建了最初的4个复选框。切换回主场景时,我希望新名称出现在复选框中。我意识到我必须彻底重新思考/修改我的代码,但我想不出一种方法来做到这一点。这可能吗?有人能帮忙吗

// EditSceneTesting

import java.io.*;
import java.util.Scanner;
import java.util.ArrayList;
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.event.*;

public class EditSceneTesting extends Application {
   private static ArrayList<String> objects;
   private Scene scene1;
   private Scene scene2;
   
   public static void main(String[] args) throws FileNotFoundException {
      File inputFile = new File("data.txt");
      Scanner inFile = new Scanner(inputFile);
      objects = new ArrayList<String>();
      
      while (inFile.hasNextLine()) {
         String line = inFile.nextLine();
         
         if (line.equals("")) {
            continue;
         }
         
         objects.add(line);
      }
      
      launch(args);
   }
   
   @Override
   public void start(Stage primaryStage) {
      // scene 1
      VBox checkBoxVBox = new VBox(5);
      
      for (String obj : objects) {
         CheckBox checkBox = new CheckBox(obj);
         checkBoxVBox.getChildren().addAll(checkBox);
      }
      
      Button addObjectsButton = new Button("Add Objects");
      AddObjectsButtonHandler addObjectsHandler = new AddObjectsButtonHandler(primaryStage);
      addObjectsButton.setOnAction(addObjectsHandler);
      
      VBox scene1Container = new VBox(20,checkBoxVBox,addObjectsButton);
      scene1 = new Scene(scene1Container,300,300);
      
      // scene 2
      Label objectLabel = new Label("Object:");
      TextField objectTextField = new TextField();
      
      HBox newObjectHBox = new HBox(5,objectLabel,objectTextField);
      
      Button addButton = new Button("Add");
      AddButtonHandler addHandler = new AddButtonHandler(objectTextField);
      addButton.setOnAction(addHandler);
      
      Button returnButton = new Button("Return to CheckBox Screen");
      ReturnButtonHandler returnHandler = new ReturnButtonHandler(primaryStage);
      returnButton.setOnAction(returnHandler);
      
      VBox scene2Container = new VBox(20,newObjectHBox,addButton,returnButton);
      scene2 = new Scene(scene2Container,300,300);
      
      primaryStage.setTitle("Edit Scene Testing");
      primaryStage.setScene(scene1);
      primaryStage.show();
   }
   
   public class AddObjectsButtonHandler implements EventHandler<ActionEvent> {
      private Stage primaryStage;
      
      public AddObjectsButtonHandler(Stage primStage) {
         primaryStage = primStage;
      }
      
      @Override
      public void handle(ActionEvent event) {
         primaryStage.setScene(scene2);
      }
   }
   
   public class AddButtonHandler implements EventHandler<ActionEvent> {
      private TextField objectTextField;
      
      public AddButtonHandler(TextField objectTF) {
         objectTextField = objectTF;
      }
      
      @Override
      public void handle(ActionEvent event) {
         // here can add to list or add to file whichever is best for solution
         objects.add(objectTextField.getText());
         
         objectTextField.clear();
      }
   }
   
   public class ReturnButtonHandler implements EventHandler<ActionEvent> {
      private Stage primaryStage;
      
      public ReturnButtonHandler(Stage primStage) {
         primaryStage = primStage;
      }
      
      @Override
      public void handle(ActionEvent event) {
         primaryStage.setScene(scene1);
      }
   }
}
//编辑场景测试
导入java.io.*;
导入java.util.Scanner;
导入java.util.ArrayList;
导入javafx.application.application;
导入javafx.stage.stage;
导入javafx.scene.scene;
导入javafx.scene.control.*;
导入javafx.scene.layout.*;
导入javafx.event.*;
公共类EditSceneTesting扩展了应用程序{
私有静态ArrayList对象;
私密场景1;
私密场景2;
公共静态void main(字符串[]args)引发FileNotFoundException{
File inputFile=新文件(“data.txt”);
扫描仪内嵌=新扫描仪(输入文件);
objects=newarraylist();
while(infle.hasNextLine()){
字符串行=infle.nextLine();
if(第行等于(“”){
继续;
}
对象。添加(行);
}
发射(args);
}
@凌驾
公共无效开始(阶段primaryStage){
//第一场
VBox checkBoxVBox=新的VBox(5);
用于(字符串对象:对象){
复选框=新复选框(obj);
checkBoxVBox.getChildren().addAll(复选框);
}
按钮addObjectsButton=新按钮(“添加对象”);
AddObjectsButtonHandler addObjectsHandler=新的AddObjectsButtonHandler(primaryStage);
addObjectsButton.setOnAction(addObjectsHandler);
VBox scene1Container=新的VBox(20,复选框VBox,addObjectsButton);
场景1=新场景(场景1容器,300300);
//场景2
Label objectLabel=新标签(“对象:”);
TextField objectTextField=新建TextField();
HBox newObjectHBox=新的HBox(5,objectLabel,objectTextField);
按钮添加按钮=新按钮(“添加”);
AddButtonHandler addHandler=新的AddButtonHandler(objectTextField);
addButton.setOnAction(addHandler);
按钮返回按钮=新按钮(“返回复选框屏幕”);
ReturnButtonHandler returnHandler=新的ReturnButtonHandler(primaryStage);
returnButton.setOnAction(returnHandler);
VBox scene2Container=新的VBox(20,newObjectHBox,addButton,returnButton);
场景2=新场景(场景2容器,300300);
primaryStage.setTitle(“编辑场景测试”);
初生阶段:场景1;
primaryStage.show();
}
公共类AddObjectsButtonHandler实现EventHandler{
私人阶段初级阶段;
public AddObjectsButtonHandler(Stage primStage){
初级阶段=初级阶段;
}
@凌驾
公共无效句柄(ActionEvent事件){
初生阶段。设置场景(场景2);
}
}
公共类AddButtonHandler实现EventHandler{
私有TextField objectTextField;
公共AddButtonHandler(TextField objectTF){
objectTextField=objectTF;
}
@凌驾
公共无效句柄(ActionEvent事件){
//这里可以添加到列表或添加到文件中,以最适合解决方案为准
add(objectTextField.getText());
objectTextField.clear();
}
}
公共类ReturnButtonHandler实现EventHandler{
私人阶段初级阶段;
公共返回按钮句柄(阶段primStage){
初级阶段=初级阶段;
}
@凌驾
公共无效句柄(ActionEvent事件){
初生阶段:场景1;
}
}
}

如果您没有绑定到复选框,您可以创建两个列表,并允许用户将人员拖放到“邀请”列表中。填充名称列表,允许用户在此列表中添加项目(您可以使用第二阶段,甚至是警报弹出窗口),并将输入的名称添加到列表中。然后他们可以把任何名字拖到通缉名单上

AddButtonHandler
中向
checkBoxVBox
添加元素不是唯一需要的吗?为什么不将对
VBox
的引用传递给处理程序(与将stage传递给其他处理程序的方式相同)?顺便说一句,让你的
对象
列出一个实例(而不是
静态
)变量,并解析文件以在
init()
(或者甚至在
start()
)中填充它可能更好。实际应用程序中的“对象”是复杂的对象,而不仅仅是字符串,在第二个屏幕上,我必须创建这些新对象并存储它们。也许我把我的例子说得太简单了。但是我会考虑传递其他参数,这个解决方案可能对我有用。同样的注释仍然适用:在
init()方法中解析文件。