java - 在 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();
}
}
推荐阅读
- php - 在 Symfony 4.4 中使用注解测试控制器
- android - 通过 Github Actions 的 android 单元测试覆盖率报告
- git - 使分叉项目与上游项目保持同步的最佳 git 工作流程是什么?
- testing - 使用 Metamask 进行测试的赛普拉斯测试方法
- python - 如何删除 matplotlib 折线图中的轴刻度?
- swift4 - 如何使用 swift xcuitest 从 pdf 文件中读取数据
- c++ - Eigen 中有没有办法一次评估多个表达式?
- ms-access - 使用条件访问查询计数
- laravel - 我想使用 Laravel 显示与名称相关的描述
- html - ONCLICK 事件没有传播?