【问题标题】:setText to many buttons - javaFXsetText 到许多按钮 - javaFX
【发布时间】:2021-04-24 05:36:32
【问题描述】:

我正在用 java 开发一些纸牌游戏。我正在将 javaFX 用于用户界面,但我有一点问题。我有 25 个按钮,我想为所有按钮添加文本。我已经完成了,但是代码很丑而且很长。我正在使用 scenebuilder 并在那里创建了按钮,每个按钮的唯一 id 为 1 到 25。有没有办法缩短此代码?

   @FXML
   Button card1;
   @FXML
   Button card2;
   @FXML
   Button card3;
   @FXML
   Button card4;
   @FXML
   Button card5;
   @FXML
   Button card6;
   @FXML
   Button card7;
   @FXML
   Button card8;
   @FXML
   Button card9;
   @FXML
   Button card10;
   @FXML
   Button card11;
   @FXML
   Button card12;
   @FXML
   Button card13;
   @FXML
   Button card14;
   @FXML
   Button card15;
   @FXML
   Button card16;
   @FXML
   Button card17;
   @FXML
   Button card18;
   @FXML
   Button card19;
   @FXML
   Button card20;
   @FXML
   Button card21;
   @FXML
   Button card22;
   @FXML
   Button card23;
   @FXML
   Button card24;
   @FXML
   Button card25;

   @FXML
   public void initialize(){
       Board board = new Board();
       board.createBoard();
       card1.setText(board.getListFields().get(0).getWord().name());
       card2.setText(board.getListFields().get(1).getWord().name());
       card3.setText(board.getListFields().get(2).getWord().name());
       card4.setText(board.getListFields().get(3).getWord().name());
       card5.setText(board.getListFields().get(4).getWord().name());
       card6.setText(board.getListFields().get(5).getWord().name());
       card7.setText(board.getListFields().get(6).getWord().name());
       card8.setText(board.getListFields().get(7).getWord().name());
       card9.setText(board.getListFields().get(8).getWord().name());
       card10.setText(board.getListFields().get(9).getWord().name());
       card11.setText(board.getListFields().get(10).getWord().name());
       card12.setText(board.getListFields().get(11).getWord().name());
       card13.setText(board.getListFields().get(12).getWord().name());
       card14.setText(board.getListFields().get(13).getWord().name());
       card15.setText(board.getListFields().get(14).getWord().name());
       card16.setText(board.getListFields().get(15).getWord().name());
       card17.setText(board.getListFields().get(16).getWord().name());
       card18.setText(board.getListFields().get(17).getWord().name());
       card19.setText(board.getListFields().get(18).getWord().name());
       card20.setText(board.getListFields().get(19).getWord().name());
       card21.setText(board.getListFields().get(20).getWord().name());
       card22.setText(board.getListFields().get(21).getWord().name());
       card23.setText(board.getListFields().get(22).getWord().name());
       card24.setText(board.getListFields().get(23).getWord().name());
       card25.setText(board.getListFields().get(24).getWord().name());

   }```

【问题讨论】:

  • 看起来至少用Java而不是FXML来完成这部分UI会好得多。

标签: java javafx


【解决方案1】:

当他们说你应该在 java 中而不是在 fxml 中创建这些项目时,每个人的意思就是这样

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {

        GridPane gridPane = new GridPane();

        //This is so you can access them later
        ArrayList<Button> buttonList = new ArrayList<>();

        for (int i = 1; i <= 5; i++) {
            for (int j = 1; j <= 5; j++) {
                Button button = new Button();
                button.setText("Card:"+i*j);
                button.setPrefSize(80,120);
                //If you need to know what card it is add the below line
                button.setId(String.valueOf(i*j));

                buttonList.add(button);

                gridPane.add(button, i, j);
            }
        }

        Scene scene = new Scene(gridPane);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

}

【讨论】:

  • 还可以将 FXML 与 Java 中的初始化混合(通过控制器)。
  • 这是真的,我只是不想去写一个 fxml 来配合这个例子
【解决方案2】:

您可以创建如下按钮列表:

List<Button> buttons = Arrays.asList(card1, card2, card3, ..., card25);

然后对其进行迭代:

for (int i = 0; i < buttons.size(); i++) {
    buttons.get(i).setText(board.getListFields().get(i).getWorld().name());
}

【讨论】:

  • 什么是EnumeratedItemListUtils?为什么不直接做for (Button btn : buttons) { ... }
  • 您需要列表中项目的索引。有关详细信息,请参阅此答案:stackoverflow.com/a/34804751/12627634
  • 啊,我明白了。不幸的是,该代码似乎是专门为该问题定制的。它很有用,但对于 OP 来说可能有点过头了(他们要么必须编写代码,要么引入整个库)。在这种情况下,假设列表为RandomAccess,使用传统的for 循环(即基于索引的for 循环)可能会更容易。
  • 那也行。我不知道为什么我没有想到这一点。编辑了我的答案
  • 虽然这绝对是对问题代码的改进,但它仍然不可扩展。 (您已经将丑陋的部分隐藏在省略号后面,但它仍然很丑陋。)您想要这个有 100 个按钮的解决方案吗? 1000?如果以某种方式动态指定按钮的数量会怎样。 (我知道这不是问题,但假设这样的事情是固定的,这绝不是好的编程习惯。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 2014-05-08
相关资源
最近更新 更多