在 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();
}
}
我想创建选项卡并动态地依次填充它们,但我不能填充多个。我做了一些研究,意识到将同一个 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();
}
}