代码之家  ›  专栏  ›  技术社区  ›  horribly_n00bie

如何在for循环中使用从一个类传递到另一个类的值?

  •  0
  • horribly_n00bie  · 技术社区  · 4 年前

    所以我有一个用户字段,他们可以在1-10中键入玩家数量:

    playersFld.setTextFormatter(new TextFormatter<String>(playersValidator));
    
    custartBtn.addEventHandler(MouseEvent.MOUSE_CLICKED, actionEvent4 -> {
    
    Integer playersNum = Integer.valueOf(playersFld.getText());
    if (!playersNum.equals("")) {
                    
                    System.out.println("Got the values");
                    try {
                        FXMLLoader loader = new FXMLLoader(getClass().getResource("/views/score_page.fxml"));
                        root = loader.load();
                        ScorePageCtrl scorePageCtrl = loader.getController();
    
                        scorePageCtrl.displayDate(strDate);
                        scorePageCtrl.recievePlayers(playersNum);
    
                        stage = (Stage) ((Node) actionEvent4.getSource()).getScene().getWindow();
                        scene = new Scene(root);
                        stage.setScene(scene);
                        stage.show();
    
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
    
                } else {
                    System.out.println("missing value(s)");
                }
    });
    

    我用这种方法将其传递给下一页的控制器:

    public int recievePlayers(int plrNum){
        System.out.println("Players: " + plrNum);
        return plrNum;
    }
    

    sout让我知道我得到了正确的数字,但我似乎无法将返回的值传递给for数组

    AtomicInteger tabs = new AtomicInteger(2);
        for (int i = 2; i <= recievePlayers(); i++) {
            if (tabs.get() <= 10) {
                tabPaneSP.getTabs().add(new Tab("Player" + tabs.getAndIncrement()));
                tabPaneSP.getSelectionModel().selectLast();
            } else {
                System.out.println("No more homies");
            }
        }
    

    我尝试了方法名,整数名,使int p;然后将其附加到返回中,但似乎什么都不起作用。

    编辑: 所以我试着改变一些事情,我可以让它发挥作用,但由于某种原因,它只每隔一段时间就会启动一次,这并不理想。

    我改变了:

    public static int plrNum;
    
    public int receivePlayers(int players) {
        System.out.println("Players: " + players);
        //Used to make sure I get the number datesSP.setText(String.valueOf(players));
        return this.plrNum = players;
    }
    

    并用它来实例化,这样我就可以把它放在for循环中:

    int n = plrNum;
    

    但必须有更好的方法。

    编辑:所以我更新了我的要点,以反映当前正在运行的代码,但由于某种原因,它只每隔一次运行一次。

    https://gist.github.com/Spider-Ian/3d5c777171d7ad632e9b71943fcf950c

    2 回复  |  直到 4 年前
        1
  •  0
  •   Sam    4 年前

    您的方法接受一个参数,但您调用它时没有参数。将其更改为

    public int recievePlayers() {
    

    它应该起作用。

    奖金提示!将其更改为

    public int receivePlayers() {
    

    以使其更易于使用。

        2
  •  0
  •   prostý člověk    4 年前

    例如,这种方式也可以工作。

    public class Player {
    
        public int num;
    
        public int recievePlayers(int plrNum){
            System.out.println("Players: " + plrNum);
            return this.num = plrNum;
        }
    
    }
        
        
        
      public static void main(String[] args) {
            
            
            Player player = new Player();
            player.recievePlayers(3);
            
            int n = player.num;
            
            AtomicInteger tabs = new AtomicInteger(2);
            for (int i = 2; i <= n; i++) {
                if (tabs.get() <= 10) {
                    tabPaneSP.getTabs().add(new Tab("Player" + tabs.getAndIncrement()));
                    tabPaneSP.getSelectionModel().selectLast();
                    
                } else {
                    System.out.println("No more homies");
                }
            }
    

    }

        3
  •  0
  •   horribly_n00bie    4 年前

    显然,控制器中发生的事件有一个非常严格的过程。它加载FXML项,初始化,然后寻找其他方法和有趣的东西。因此,为了确保选项卡首先获得数据,我可以使用上一个控制器提前调用它们。

    threeThirBtn.addEventHandler(MouseEvent.MOUSE_CLICKED, actionEvent1 -> {
            try {
                FXMLLoader loader = new FXMLLoader(getClass().getResource("/views/score_page.fxml"));
                root = loader.load();
                ScorePageCtrl scorePageCtrl = loader.getController();
    
                scorePageCtrl.displayDate(strDate);
                scorePageCtrl.displayEvent("3 x 30");
                scorePageCtrl.receivePlayers(3);
                scorePageCtrl.receivePlays(3);
                scorePageCtrl.receiveRounds(30);
    //**Here is where I told the method to get the returned value before initialization**
                scorePageCtrl.addTabs();
                scorePageCtrl.addRows();
    
                stage = (Stage) ((Node) actionEvent1.getSource()).getScene().getWindow();
                scene = new Scene(root);
                stage.setScene(scene);
                stage.show();
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            //TODO: Set the row and column numbers to thirty rows and three columns
    
            System.out.println("3 x 30 button clicked");
    
        });
    

    我确实不得不将AtomicInteger从初始化中移到它自己的方法中。

    public void addTabs() {
        int plr = plrNum;
    
        AtomicInteger tabs = new AtomicInteger(2);
        for (int i = 2; i <= plr; i++) {
            if (tabs.get() <= 10) {
                tabPaneSP.getTabs().add(new Tab("Player" + tabs.getAndIncrement()));
                tabPaneSP.getSelectionModel().selectLast();
            } else {
                System.out.println("No more homies");
            }
        }
        addPlayerBtn.setOnAction(event -> {
            if (tabs.get() <= 10) {
                tabPaneSP.getTabs().add(new Tab("Player" + tabs.getAndIncrement()));
                tabPaneSP.getSelectionModel().selectLast();
            } else {
                System.out.println("No more homies");
            }
        });
    }
    

    我唯一不满意的是,要得到一个作为可用整数返回的get值,需要花费太多的时间。