在 JavaFX 上动态添加和填充选项卡

Add and fill tabs dynamically on JavaFX

我想创建选项卡并动态地依次填充它们,但我不能填充多个。我做了一些研究,意识到将同一个 FlowPane 放在几个地方是不可能的,但我想知道当时该怎么做。我尝试了几种封装方法,要么产生错误,要么结果保持不变。 谢谢你。

这是我的代码:

public class ButtonController implements Initializable{
    @FXML
    private Button bubu;
    @FXML
    private Button bb;
    @FXML
    private TabPane tp;

    List<Button> buttonlist = new ArrayList<>();
    List<Tab> tablist = new ArrayList<>();

    Main parent;

    public void setParent(Main main) {
        this.parent=main;
    }

    @FXML
    public void action() {
        try {
            Connection conn = bddUtil.dbConnect();
            tablist.clear();
            buttonlist.clear();
            ResultSet rs = conn.createStatement().executeQuery("select nom, prix from produit");
            ResultSet res = conn.createStatement().executeQuery("select nom from type_produit");
            while (res.next()) {
                Tab tab = new Tab(res.getString("nom"));
                FlowPane flowp = new FlowPane();
                tablist.add(tab);
                tab.setContent(flowp);
                flowp.setAlignment(Pos.BASELINE_CENTER);
                while (rs.next()) {
                    Button btn = new Button(rs.getString("nom") + "\n" + rs.getInt("prix") + "€");
                    btn.setPrefSize(200, 100);
                    btn.setTextAlignment(TextAlignment.CENTER);
                    btn.setAlignment(Pos.CENTER);
                    btn.setOnAction(new EventHandler<ActionEvent>() {
                        @Override 
                        public void handle(ActionEvent e) {
                            String txtBtn = btn.getText();
                        }
                    });
                    buttonlist.add(btn);
                }
                flowp.getChildren().addAll(buttonlist);
            }
            tp.getTabs().addAll(tablist);
        } catch (Exception e) {
            System.out.println("err: " + e);
            e.printStackTrace();
        }
    }

    class HandlerBtn1 implements EventHandler<ActionEvent>{
        public void handle(ActionEvent e) {
            System.out.println("ok");
        }
    }
}

我终于找到了一种方法,它可能不是最好的方法,但它确实有效,所以如果有人遇到同样的问题,我会把它留在这里!

    @FXML
private TabPane tp;

List<Button> buttonlist = new ArrayList<>();
List<Tab> tablist = new ArrayList<>();

Map<String, Tab> map= new HashMap<>();

ArrayList<String> nomProduits = new ArrayList<>();

@FXML
public void action() {
    try {
        Connection conn = bddUtil.dbConnect();
        tablist.clear();
        buttonlist.clear();
        ResultSet rs = conn.createStatement().executeQuery("select produit.nom, prix, type_produit.nom from produit inner join type_produit on produit.idType=type_produit.idType");
        while (rs.next()) {
            Tab tab = new Tab(rs.getString("type_produit.nom"));
            map.put(rs.getString("type_produit.nom"), tab);
            nomProduits.add(rs.getString("produit.nom"));
        }

        for (Tab tab : map.values()) {  
            FlowPane fp = new FlowPane();
            tab.setOnSelectionChanged(new EventHandler<Event>() {
                public void handle(Event event) {
                    fp.getChildren().clear();
                    for (int i = 0; i < nomProduits.size(); i++) {
                        Button btnPlat = new Button(nomProduits.get(i));
                        fp.getChildren().add(btnPlat);  
                    }
                    tab.setContent(fp);

                }
            });
        }
tp.getTabs().addAll(map.values());
    } catch (Exception e) {
        System.out.println("err: " + e);
        e.printStackTrace();
    }
}