2015-12-21 86 views
0

我有一个网格窗格,其中包含一些按钮(通常在10和25之间),每行五个按钮(但是很多都留在最后一行)。程序执行期间,按钮的数量(和按钮本身)可能会改变。发生这种情况时,应该显示新的按钮。我怎样才能做到这一点?这里是一个小例子:用JavaFX中的新按钮动态更新GridPane - >如何重绘?

public class GridButtons extends Application { 
    List<String> buttonTexts = new ArrayList<>(); 
    GridPane buttonGrid = new GridPane(); 
    GridPane bgGrid = new GridPane(); 

    @Override 
    public void start(Stage primaryStage) { 
     Button changeButtonsButton = new Button("Change BTNs"); 
     changeButtonsButton.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       changeButtonTexts(); 
      } 
     }); 
     bgGrid.add(changeButtonsButton, 0, 0); 
     changeButtonTexts(); 
     bgGrid.add(buttonGrid, 1, 0); 

     Scene scene = new Scene(bgGrid, 440, 140); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public void updateButtonsGrid() { 
     buttonGrid = new GridPane(); 
     for (int i = 0; i < buttonTexts.size(); i++) { 
      Button button = new Button(buttonTexts.get(i)); 
      button.setMinWidth(70); 
      button.setMaxWidth(70); 
      buttonGrid.add(button, i % 5, i/5); 
      System.out.println(buttonTexts.get(i)); 
     } 
     // now the new GridPane should be displayed -> how? 
    } 

    public void changeButtonTexts() { 
     buttonTexts.clear(); 
     Random random = new Random(); 
     int buttonCount = random.nextInt(15) + 10; 
     for (int i = 0; i < buttonCount; i++) { 
      buttonTexts.add("Button " + i); 
     } 
     updateButtonsGrid(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

还是有比使用GridPane更好的选择?使用ListView<Button>ObservableList<Button>可以工作,但这些按钮不会以表格形式显示,每行有五个按钮。

+0

为什么要创建一个新的'GridPane'而不是在场景中使用一个?这可能是你的问题... – Itai

回答

3

创建一个新的GridPane可能不是你想要的。在功能updateButtonsGrid,改线

buttonGrid = new GridPane(); 

buttonGrid.getChildren().clear(); 

如果由于某种原因,你有绝对的把握,你需要的GridPane一个新实例,请从bgGrid旧人,并添加新的那一个。在您当前的代码示例中,GridPane的新实例永远不会添加到场景图中。

相关问题