Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.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_Javafx 8 - Fatal编程技术网

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

在JavaFX上动态添加和填充选项卡,java,javafx,javafx-8,Java,Javafx,Javafx 8,我想创建选项卡并动态地依次填充它们,但我不能填充多个选项卡。我做了一些研究,意识到将同一个流程窗格放在几个地方是不可能的,但我想知道当时该怎么做。我尝试了几种封装方法,要么产生错误,要么结果保持不变。 多谢各位 这是我的密码: public class ButtonController implements Initializable{ @FXML private Button bubu; @FXML private Button bb; @FXML

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

这是我的密码:

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");
        }
    }
}
公共类ButtonController实现可初始化{
@FXML
私人按钮bubu;
@FXML
私人按钮bb;
@FXML
私人选项卡;
列表按钮列表=新建ArrayList();
列表列表=新的ArrayList();
主要父母;
公共void setParent(主){
this.parent=main;
}
@FXML
公共无效行动(){
试一试{
连接conn=bddUtil.dbConnect();
小报作者:clear();
按钮列表。清除();
ResultSet rs=conn.createStatement().executeQuery(“从produit中选择nom、prix”);
ResultSet res=conn.createStatement().executeQuery(“从类型_produit中选择nom”);
while(res.next()){
Tab Tab=新选项卡(res.getString(“nom”);
FlowPane flowp=新的FlowPane();
tablist.add(选项卡);
tab.设置内容(flowp);
流量设置校准(位置基线\中心);
while(rs.next()){
按钮btn=新按钮(rs.getString(“nom”)+“\n”+rs.getInt(“prix”)+“€”);
btn.setPrefSize(200100);
btn.setTextAlignment(TextAlignment.CENTER);
btn.设置校准(位置中心);
btn.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent e){
字符串txtBtn=btn.getText();
}
});
按钮列表。添加(btn);
}
flowp.getChildren().addAll(按钮列表);
}
tp.getTabs().addAll(tablist);
}捕获(例外e){
System.out.println(“err:+e”);
e、 printStackTrace();
}
}
类HandlerBtn1实现EventHandler{
公共无效句柄(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();
    }
}
@FXML
私人选项卡;
列表按钮列表=新建ArrayList();
列表列表=新的ArrayList();
Map Map=newhashmap();
ArrayList nomProduits=新的ArrayList();
@FXML
公共无效行动(){
试一试{
连接conn=bddUtil.dbConnect();
小报作者:clear();
按钮列表。清除();
结果集rs=conn.createStatement().executeQuery(“从produit.idType=type_produit.idType上的produit内部连接类型_produit中选择produit.nom、prix、type_produit.nom”);
while(rs.next()){
Tab Tab=新选项卡(rs.getString(“type_produit.nom”);
map.put(rs.getString(“type_produit.nom”),选项卡);
添加(rs.getString(“produit.nom”);
}
对于(选项卡:map.values()){
FlowPane fp=新的FlowPane();
tab.setOnSelectionChanged(新的EventHandler(){
公共无效句柄(事件){
fp.getChildren().clear();
对于(int i=0;i
您的内部循环确保第一个结果集在填充第一个选项卡后耗尽。您应该在多个选项卡中获得多个
FlowPane
s,但所有按钮都进入第一个选项卡。。。您可以使用单个查询和
Map
将选项卡按值存储在
nom
列中……请注意,
VARCHAR
(或类似)可能不是外键的最佳列,在两个表中复制数据通常不是一个好主意。谢谢您的回答。我没有正确理解,如何显示所有选项卡中的所有按钮?我还不太熟悉地图,所以我真的不知道怎么做。。。我曾想过在我的sql请求中创建一个内部连接,但我最终得到了和按钮一样多的选项卡,Map能解决这个问题吗?我有两张桌子,一张包含食物名称,另一张参考它们的类型(如鸡蛋和培根->早餐),所以有必要有两张桌子,对吗?冒着听起来傲慢的风险,我认为你想做的太多了。创建GUI已经是一个相对高级的主题,但是当您对基本数据结构(如
Map
)缺乏基本了解时,尝试这样做只会使过程更加困难。最重要的是,您似乎对JDBC或SQL都不熟悉,但您正试图将这些技术与您似乎也不熟悉的UI技术集成在一起。我明白,只有通过实践才能变得更好,但我是否可以建议您分别学习每种技术,以便您在尝试集成它们之前至少对每种技术都感到满意?在我看来,理解SQL将使使用JDBC更容易推理;在学习UI工具包之前,您还应该熟悉“日常Java”。另外,请注意,UI代码可能与您过去看到的和当前的不同。