JavaFX如何添加元素例如。从存储在数据库中的项目动态创建按钮Mysql?
有这段视频在YouTube上https://www.youtube.com/watch?v=Idtm2Y6I23w 由此人已动态填充从项目创建按钮,存储在database.For比如在这张照片 JavaFX如何添加元素例如。从存储在数据库中的项目动态创建按钮Mysql?
它有一些类别包括Tables
,Stock
,Reports
和Users
当用户点击Table
类别时,它会显示Buttons
动态地根据数据库mysql中存储的项目创建。例如,这是结果图片:
如何才能像那样发展? 是否有for循环语句将被使用?
编辑
这就是我是如何做到的。这是源代码。
public class OrderController implements Initializable {
@FXML
private ListView<Button> listvieww;
@FXML
private HBox hboxx;
List<String> listOfSomething = null;
//@FXML
// private Pane panedynamic;
private DBConnection database = new DBConnection();
private Connection connection;
private Statement statement;
private ResultSet resultSet;
private ObservableList<Button> buttons = FXCollections.observableArrayList();
/**
* Initializes the controller class.
*/
@Override
public void initialize(URL url, ResourceBundle rb) {
hboxx.getChildren().add(buttons)
}
@FXML
void acttable(ActionEvent event) {
// TODO
String sqlQuery = "SELECT * FROM restauranttables;";
try {
connection = database.getConnection();
statement = connection.createStatement();
resultSet = statement.executeQuery(sqlQuery);
while (resultSet.next()) {
String current = resultSet.getString("tablename");
ObservableList<String> list = FXCollections.observableArrayList(current);
Button b = new Button(list.toString());
buttons.add(b);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
@FXML
void actlogout(ActionEvent event) {
}
@FXML
void actnew(ActionEvent event) {
}
@FXML
void actorder(ActionEvent event) {
}
@FXML
void actreports(ActionEvent event) {
}
@FXML
void actstock(ActionEvent event) {
}
@FXML
void actusers(ActionEvent event) {
}
}
这是我的场景生成器看起来像
<?xml version="1.0" encoding="UTF-8"?>
<?import com.jfoenix.controls.JFXButton?>
<?import com.jfoenix.controls.JFXTextField?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.StackPane?>
<AnchorPane id="AnchorPane" prefHeight="600.0" prefWidth="1080.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controllers.OrderController">
<children>
<AnchorPane layoutX="55.0" layoutY="29.0" prefHeight="600.0" prefWidth="1080.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<children>
<TableView layoutX="21.0" layoutY="49.0" prefHeight="386.0" prefWidth="413.0">
<columns>
<TableColumn prefWidth="122.0" text="Description" />
<TableColumn prefWidth="57.0" text="Price" />
<TableColumn prefWidth="81.0" text="Sub Total" />
<TableColumn prefWidth="96.0" text="Table Id" />
<TableColumn prefWidth="57.0" text="Price" />
</columns>
</TableView>
<JFXTextField layoutX="53.0" layoutY="439.0" prefHeight="37.0" prefWidth="155.0" />
<JFXTextField layoutX="253.0" layoutY="439.0" prefHeight="37.0" prefWidth="155.0" />
<GridPane layoutX="63.0" layoutY="503.0" prefHeight="75.0" prefWidth="345.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<AnchorPane prefHeight="200.0" prefWidth="200.0">
<children>
<JFXButton layoutX="25.0" layoutY="25.0" onAction="#actorder" prefHeight="75.0" prefWidth="173.0" text="Order" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
</children>
</AnchorPane>
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1">
<children>
<JFXButton layoutX="39.0" layoutY="14.0" onAction="#actnew" prefHeight="75.0" prefWidth="172.0" text="New" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
</children>
</AnchorPane>
</children>
</GridPane>
<MenuBar layoutX="21.0" layoutY="14.0" prefHeight="29.0" prefWidth="413.0">
<menus>
<Menu mnemonicParsing="false" text="File">
<items>
<MenuItem mnemonicParsing="false" text="Close" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Edit">
<items>
<MenuItem mnemonicParsing="false" text="Delete" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Help">
<items>
<MenuItem mnemonicParsing="false" text="About" />
</items>
</Menu>
</menus>
</MenuBar>
<StackPane fx:id="acContent" layoutX="454.0" layoutY="49.0" prefHeight="525.0" prefWidth="605.0">
<children>
<AnchorPane fx:id="anchora" prefHeight="200.0" prefWidth="200.0">
<children>
<GridPane fx:id="sasa" layoutX="17.0" layoutY="7.0" prefHeight="90.0" prefWidth="571.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<AnchorPane prefHeight="200.0" prefWidth="200.0">
<children>
<JFXButton fx:id="table" layoutX="37.0" layoutY="19.0" onAction="#acttable" prefHeight="90.0" prefWidth="135.0" text="TABLE" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
</children>
</AnchorPane>
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1">
<children>
<JFXButton fx:id="stock" layoutX="43.0" layoutY="32.0" onAction="#actstock" prefHeight="90.0" prefWidth="134.0" text="STOCK" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
</children>
</AnchorPane>
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2">
<children>
<JFXButton fx:id="reports" layoutX="26.0" layoutY="32.0" onAction="#actreports" prefHeight="90.0" prefWidth="134.0" text="REPORTS" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
</children>
</AnchorPane>
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="3">
<children>
<JFXButton fx:id="users" layoutX="26.0" layoutY="32.0" onAction="#actusers" prefHeight="90.0" prefWidth="134.0" text="USERS" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
</children>
</AnchorPane>
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="4">
<children>
<JFXButton fx:id="logout" layoutX="28.0" layoutY="32.0" onAction="#actlogout" prefHeight="90.0" prefWidth="134.0" text="LOGOUT" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
</children>
</AnchorPane>
</children>
</GridPane>
<HBox fx:id="hboxx" layoutX="17.0" layoutY="110.0" prefHeight="398.0" prefWidth="571.0" />
</children>
</AnchorPane>
</children>
</StackPane>
</children>
</AnchorPane>
</children>
</AnchorPane>
我将要对齐的按钮在横向盒,但我在这里
@Override
public void initialize(URL url, ResourceBundle rb) {
hboxx.getChildren().add(buttons)
}
得到一个错误的任何帮助,谢谢。
你想实现的工作流程:
- 检索基于一个动作事件
- 对于每一行从返回从DB一些信息(1) - >创建一个按钮
-
将所有创建的按钮添加到某个容器
@FXML void acttable(ActionEvent event) { String sqlQuery = "SELECT * FROM restauranttables;"; List<Button> buttonlist = new ArrayList<>(); //our Collection to hold newly created Buttons try { connection = database.getConnection(); statement = connection.createStatement(); resultSet = statement.executeQuery(sqlQuery); while (resultSet.next()) { //iterate over every row returned String restaurant = resultSet.getString("restaurantname"); //extract button text, adapt the String to the columnname that you are interested in buttonlist.add(new Button(restaurant)); } hboxx.getChildren().clear(); //remove all Buttons that are currently in the container hboxx.getChildren().addAll(buttonlist); //then add all your Buttons that you just created } catch (SQLException e) { e.printStackTrace(); } finally{ resultSet.close(); statement.close(); connection.close; } }
所以工作流程,有什么发生了:
- 您创建一个列表,将保留您的所有新的按钮。
- 你执行一个查询
- 从2
- 遍历ResultSet中你抢,你要设置为按钮文本字符串值
- 你,按钮添加到列表
- 你清楚你的HBox中从先前添加的按钮
- 添加的所有新的按钮到您的HBox中
编辑:不要忘记关闭ResultSet,语句和连接。如果您想将try/catch转换为try with resources,则可以避免显式的.close(),因为所有三个对象都实现了Autoclosable接口。我添加了一个“finally”语句,当您的try块退出时将执行该语句。你也可以检查resultSet/statement/connection是否为空。
它工作谢谢 –
你需要一个循环。基本上,你可以遍历你的项目,并为每个项目创建一个按钮,并将其添加到窗格。
List<Element> databaseItems = getElementFromDataBase();
int i = 0;
int j = 0;
for(Element databaseItem : databaseItems) {
Button tempButton = new Button(databaseItem.getName());
tempButton.setOnAction(new MyClickListener()) //handle button click
gridPane.add(i, j);
i ++;
if(i == GridPane.getRowIndex()) {
j++; // get to the new row.
}
}
该代码可能不准确,但它给出了一个大致的了解。
// connectivity for mysql database coding
String category_name= "Stock";
Class.forName("com.mysql.jdbc.Driver");
Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/sonoo","root","root");
Statement stmt=con.createStatement();
ResultSet rs=stmt.executeQuery("select * from category where category_name=" + "'" + category_name + "'");
rs.next();
int num_of_rows = rs.getInt(3); (Fetched from database according to category)
Panel p1=new Panel();
p1.setLayout(new GridLayout(Math.Ceil(num_of_rows/6),6,10,10));
Button b[];
b=new Button[num_of_rows];
for(int i=0;i<num_of_rows;i++)
{
\t b[i]=new Button(category_name + "" + (i+1));
\t p1.add(b[i]);
\t b[i].addActionListener(this); // needed if to perform button click
}
//adding the panel to the container
add(p1);
public void actionPerformed(ActionEvent ae)
{
\t // The event click code goes here
}
其实你提供了一个可以在swing上运行的代码,我想要一个javafx一个谢谢 –
@Jalin写一个答案不仅仅是写正确的代码。解释你的代码的作用同样重要。 – Tavo
显示你的尝试。然后,人们将能够帮助您编写代码,而不是为您编写代码。 – Tavo
让我告诉你我试过的东西 –