当前位置: 首页 > 知识库问答 >
问题:

JavaFX:通过选定的组合框更新tableview上下文(绑定)

郑西岭
2023-03-14

我想通过选择combobox项在数据库中的tableview中显示数据。组合框包含用户可以选择的“我的数据库”中的列。我这样做,组合框是好的,代码工作没有错误,但表没有更新。

控制器类:

package application;

    import java.io.IOException;
    import java.net.URL;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.ResourceBundle;

    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    import javafx.fxml.Initializable;
    import javafx.scene.Node;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.scene.control.ComboBox;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableView;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.stage.Stage;

        public class SortareDupaAngajatiController implements Initializable{
            final ObservableList<tableAngajati> data=FXCollections.observableArrayList();
            final ObservableList<String> optiuni=FXCollections.observableArrayList();
            PreparedStatement intabel=null;
            ResultSet rezultate=null;
            String prequery;
            String postquery;

             @FXML
             public ComboBox<String> meniu;
             @FXML
             TableView<tableAngajati> tabelangajati;

             @FXML
             private TableColumn<tableAngajati,String> numesediucol;

             @FXML
             private TableColumn<tableAngajati,Integer> angajaticol;

            @Override
            public void initialize(URL location, ResourceBundle resources) {

                comboMeniu();
                insertInTabel();


            }


            public void comboMeniu(){
                try {
                    String query = "SELECT * FROM maginfo";
                    PreparedStatement dindb = Conexiune.conexiuneBd.prepareStatement(query);
                    ResultSet rezultate = dindb.executeQuery();


                    while (rezultate.next()) {
                        optiuni.add(rezultate.getString("nume"));
                        meniu.setItems(optiuni);
                    }
                    dindb.close();
                    rezultate.close();   
            }
            catch (Exception ex) {
                ex.printStackTrace();
            }
            }

            public void insertInTabel(){

        try {
                    prequery="SELECT * FROM sediu where nume='"+meniu.getValue()+"'ORDER BY numarangajati DESC";
                    postquery=prequery;
                    intabel= Conexiune.conexiuneBd.prepareStatement(postquery);
                    rezultate=intabel.executeQuery();

                    while(rezultate.next()){
                        data.add(new tableAngajati(
                                rezultate.getString(2),
                                rezultate.getInt(7)
                                ));


                    }

                    intabel.close();
                    rezultate.close();

                } catch (Exception e) {
                    System.err.println(e);
                }

                numesediucol.setCellValueFactory(new PropertyValueFactory<>("numesediu"));
                angajaticol.setCellValueFactory(new PropertyValueFactory<>("numarangajati"));
                tabelangajati.setItems(null);
                tabelangajati.setItems(data);

            }}

表类:


    package application;

    public class tableAngajati {
        private String numesediu;
        private int angajati;


        public tableAngajati(String numesediu, int angajati) {
            super();
            this.numesediu=numesediu;
            this.angajati=angajati;
        }

        public String getNumesediu(){
            return numesediu;
        }

        public void setNumesediu(String numesediu){
            this.numesediu=numesediu;
        }

        public int getNumarangajati(){
            return angajati;
        }

        public void setNumarangajati(int angajati){
            this.angajati=angajati;
        }

    }

多谢!

共有1个答案

杭涵映
2023-03-14

FXML文件:

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.control.Separator?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.text.Font?>

<AnchorPane prefHeight="389.0" prefWidth="620.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.SortareDupaAngajatiController">
   <children>
      <Separator layoutX="178.0" orientation="VERTICAL" prefHeight="382.0" prefWidth="0.0" />
      <Pane layoutX="-9.0" layoutY="-1.0" opacity="0.6" prefHeight="390.0" prefWidth="190.0" style="-fx-background-color: #0074D9;">
         <children>
           <Button layoutX="35.0" layoutY="20.0" mnemonicParsing="false" onAction="#arataHome" prefHeight="100.0" prefWidth="130.0" style="-fx-background-color: #FFF;" text="Home" />
            <Button layoutX="35.0" layoutY="146.0" mnemonicParsing="false" onAction="#arataAdaugareSediu" prefHeight="100.0" prefWidth="130.0" style="-fx-background-color: #FFF;" text="Adauga sediu" />
            <Button layoutX="35.0" layoutY="272.0" mnemonicParsing="false" onAction="#arataAdaugareMagazin" prefHeight="100.0" prefWidth="130.0" style="-fx-background-color: #FFF;" text="Adauga supermarket" />
         </children>
      </Pane>
      <Label layoutX="195.0" layoutY="10.0" text="Sortare supermarket-uri dupa nr. de angajati din toate sediile" wrapText="true">
         <font>
            <Font name="Berlin Sans FB" size="16.0" />
         </font>
      </Label>
       <ScrollPane layoutX="194.0" layoutY="38.0" prefHeight="304.0" prefWidth="414.0">
        <content>
          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="361.0" prefWidth="399.0">
               <children>
                  <TableView fx:id="tabelangajati" layoutX="1.0" layoutY="30.0" prefHeight="338.0" prefWidth="411.0">
                    <columns>
                      <TableColumn fx:id="numesediucol" prefWidth="204.0" sortable="false" text="Sedii" />
                      <TableColumn fx:id="angajaticol" prefWidth="193.0" sortable="false" text="Numar angajati" />
                    </columns>
                  </TableView>
                  <ComboBox fx:id="meniu" layoutX="100.0" layoutY="3.0" prefHeight="25.0" prefWidth="209.0" promptText="Selectati supermarket-ul" />
               </children></AnchorPane>
        </content>
      </ScrollPane>
      <Button layoutX="556.0" layoutY="354.0" mnemonicParsing="false" onAction="#Inapoi" text="Inapoi" />
   </children>
</AnchorPane>
 类似资料:
  • 几个小时寻找答案后,我终于放弃了。我有一个包含以下组合框的FXML表单: 它注入到 JavaFX 控制器类中: 该组合显示了使用Eclipselink 2.7和JPA 2.2从嵌入式H2数据库加载的Tobra(在西班牙语中代表Tipo de Obra)列表。 我不会向用户展示Tobra的价值。toString,相反,我在初始化中设置了一个转换器: 我有一个实现<code>Task的内部类 当然,当

  • 我刚刚创建了一个TablView,我成功地将数据放入其中。问题是当我双击一个单元格(要更新)时,它会显示更新的数据,但当我单击离开时,更新的单元格会显示旧数据! 这里的代码: 有人能帮帮我吗?厚度

  • 我想要一个组合框,它会在用户键入时过滤列表项。它应该如下工作: 键入时,文本字段应该显示一个可能的选择,但是用户尚未键入的单词部分应该突出显示。 当他打开列表时,下拉框应该只显示可能的选项? 使用箭头键,用户应该在缩小可能的项目后选择剩余的项目之一。 过滤并不重要,跳转到第一个匹配的选择也可以。 有类似的吗?

  • 我想在JavaFX中显示内容。下面是我用来将内容设置到表列中的代码。我遇到的问题是,它只显示一行。循环只迭代了5次:每次它都会获取的第一个值。 如果忽略行,则循环将迭代中的所有内容。

  • 我创建了绑定到viewmodel相同属性的combobox和textblock 结果是在组合框中显示错误的selecteditem(总是第一个)。Textblock总是有正确的值。当我在combobox中选择不同的值时,textblock会正确更新。如果我移除 IsSynchronizedWithCurrentItem=“真” 然后组合框显示“空”值。语言的选择项目应该有正确的对象(通过调试)。