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

可观察列表未显示在 fxml 定义的表视图中 - 失去生存意愿;)

芮瑾瑜
2023-03-14

编辑并删除所有未使用的代码

不熟悉使用JDK 8和eclipse的Javafx / scene builder。

Sql DB连接工作正常,并拉至填充虚拟表视图的记录集,system.out打印DB记录等。我正在使用scenebuilder,并尝试在scene builder中填充一个FXML定义的< code>Tableview,学习起来很有趣。

我只是无法将数据获取到表视图。

我将static添加到私有静态ObservableList

我现在没有错误,但在定义的表视图中看不到任何数据。当我在没有 id 的情况下向 scenebulder 添加一列时,我得到不同颜色的行,这让我认为它正在做一些事情,控制器附加到场景构建器中。

我现在只想拉所有的表列来测试,然后我就可以继续了。对混乱的代码表示歉意,但最好在第一周就把它留下。

如果有任何帮助,我将不胜感激,真的。

控制器,忽略导入

public class SoftwareController extends Application implements Initializable  {

    private static ObservableList<ObservableList<String>> data;
    @FXML 
    public TableView<ObservableList<String>> tblSoftware;
    public Statement st;
    public Connection conn;

    public static void main(String[] args) {
        launch(args);   
    }
    public void buildData() {
        data = FXCollections.observableArrayList();
    try {

        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");  
        String url = "jdbc:sqlserver://IP;databaseName=CMDB";
        conn = DriverManager.getConnection(url,"cmdbadmin","cmdbadmin!1");
        System.out.print("connection successfulltttt");
        String SQL = "SELECT * from Data_CMDB_Main";

        ResultSet rs = conn.createStatement().executeQuery(SQL);

        for(int i=0 ; i<rs.getMetaData().getColumnCount(); i++) {
            final int j = i;
            TableColumn col = new TableColumn(rs.getMetaData().getColumnName(i+1)); 

            public ObservableValue<String> call(CellDataFeatures<ObservableList, String> param) {   
               return new SimpleStringProperty(param.getValue().get(j).toString());
            }
        });
           System.out.println(col);
       }
       while (rs.next()){
           ObservableList<String> row = FXCollections.observableArrayList();

          for(int i=1 ; i<=rs.getMetaData().getColumnCount(); i++) {
            row.add(rs.getString(i));
          }
          data.add(row);
          System.out.println(row);  //shows records from database
        }

    }catch (Exception e) {
        e.printStackTrace();
        System.out.println("Error building data");
    }
    }
    @Override
    public void start(Stage stage) throws Exception {   
        buildData();    
    }
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/Software.fxml"));
    Parent root1 = (Parent) fxmlLoader.load();
    Stage stage1 = new Stage();;
    stage1.setScene(new Scene(root1));
    stage1.show();

    }
    public Label lblTest;

    public void btnSoftwarePressed(ActionEvent event) {
        lblTest.setText("label working");
    }
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        System.out.println(data);
        if(data !=null){
            System.out.println("data is not null");
            tblSoftware.getItems().addAll(data);
        }
        else System.out.println("data is null");
    }
}

格式xl

<?import java.lang.*?>
<?import java .util.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane prefHeight="368.0" prefWidth="433.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fxml.SoftwareController">
     <children>
<TableView fx:id="tblSoftware" layoutY="102.0" prefHeight="266.0" prefWidth="433.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="102.0">
             <columns>
             <TableColumn prefWidth="75.0" text="Column X" />
             </columns>
        </TableView>
         <Button fx:id="btnSoftware" layoutY="63.0" mnemonicParsing="false" onAction="#btnSoftwarePressed" text="Button" />
         <Label fx:id="lblTest" layoutX="226.0" layoutY="63.0" prefHeight="26.0" prefWidth="130.0" text="22" />
    </children>
</AnchorPane>

共有1个答案

左丘宜年
2023-03-14

我想尝试看看它是如何在不使用单独的控制器和应用程序文件的情况下工作的。

注意,我必须像James_D提到的那样在initialize方法中调用buildData。

这要求你把H2作为一个库放在某个地方,但是我认为你的连接是好的,所以删除H2部分,取消你的连接。

package fxml;

import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ResourceBundle;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.stage.Stage;

public class SoftwareController extends Application implements Initializable  {

    private static ObservableList<ObservableList<String>> data;

    @FXML public TableView<ObservableList<String>> tblSoftware;

    public void buildData() throws Exception{
        data = FXCollections.observableArrayList();
        DriverManager.registerDriver(new org.h2.Driver());
        Connection conn = DriverManager.getConnection("jdbc:h2:mem:");
        Statement stmt = conn.createStatement();
        String sql = "CREATE TABLE Data_CMDB_Main (name VARCHAR(255), address VARCHAR(255))";
        stmt.executeUpdate(sql);
        for (int i = 0; i < 10; i++) {
            sql = "INSERT INTO Data_CMDB_Main VALUES ("
                    + "'1st string in row " + i + "','2nd string in row " + i + "')";
            stmt.executeUpdate(sql);
        }

//        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//        String url = "jdbc:sqlserver://IP;databaseName=CMDB";
//        Connection conn = DriverManager.getConnection(url, "cmdbadmin", "cmdbadmin!1");
//        System.out.print("connection successfulltttt");
        String SQL = "SELECT * from Data_CMDB_Main";

        ResultSet rs = conn.createStatement().executeQuery(SQL);

        for(int i=0 ; i<rs.getMetaData().getColumnCount(); i++) {
            final int j = i;
            TableColumn<ObservableList<String>, String> col = new TableColumn(rs.getMetaData().getColumnName(i+1));
            col.setCellValueFactory(p -> new ReadOnlyStringWrapper(p.getValue().get(j)));
            tblSoftware.getColumns().add(col);
        }

        while (rs.next()) {
            ObservableList<String> row = FXCollections.observableArrayList();
            for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
                row.add(rs.getString(i));
            }
            data.add(row);
        }
        tblSoftware.setItems(data);
    }

    @Override
    public void start(Stage stage) throws Exception {   
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/Software.fxml"));
        Parent root1 = (Parent) fxmlLoader.load();
        stage.setScene(new Scene(root1));
        stage.show();
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        try {
            buildData();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    @FXML private void btnSoftwarePressed(){}

    public static void main(String[] args) { launch(args);}    

}
 类似资料:
  • 我有一个class,它在其他属性中包含一个可观察列表 如何让JavaFX提取class

  • 我正在用一个库编程,我不知道代码,只知道方法,我不能修改它。我试着制作一个“航班”的表格视图,但我不知道如何为每个航班命名(或ID)。有人能帮我吗?谢谢此处有一些代码:

  • 问题内容: 我正在尝试将项目设置为表视图,但是setitems方法需要一个可观察的列表,而我的模型中却有一个可观察的集合.FXCollections实用程序类没有给定可观察的集合来创建可观察的列表的方法。类强制转换异常(按预期)。 目前,我正在使用这种代码 而且我有一些问题: 在表中进行编辑是否会按预期更新基础集? 这是这样做的“正确”方法吗 简而言之,我需要样式指南或最佳做法,以便在可观察集和可

  • 问题内容: 给定汽车清单(),我可以这样做: 有没有办法我可以从一个到一个序列? 像没有参数的东西 问题答案: 您可以这样映射到: 请注意,flatMapping可能不会保留源可观察的顺序。如果订单对您很重要,请使用。

  • 提前致谢 下面是我的plugin.xml