【问题标题】:JavaFX Scene builder table wont fill up using Java DBJavaFX 场景构建器表不会使用 Java DB 填满
【发布时间】:2016-11-12 06:11:39
【问题描述】:

我一直在努力弄清楚如何让列表显示在我的表格视图中。因为它的输出是我的列表,这很棒,但我可以在我通过场景生成器制作的表格中看到它。该表具有相同的 fx:id,所以不是这样。数据显示正常,正在编译,但表格上仍然没有数据。

public class FXMLDocument_PopulationDatabase_AllieBeckmanController implements Initializable {

@FXML
private ChoiceBox GetBox;
@FXML
private ChoiceBox SortBox;
@FXML
private TableView CityTable;

@FXML
private TableColumn COne;
@FXML
private TableColumn CTwo;

private final ObservableList dta = FXCollections.observableArrayList();

@Override
public void initialize(URL url, ResourceBundle rb) {


    // TODO
    try{
        // call the driver used to connect to the database
        Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();

        // connect to the city data base
        Connection c = DriverManager.getConnection("jdbc:derby://localhost:1527/CityDB;create=true", "AllieBeckman", "1122");

        // create a statement used to sort through the data in the database
        Statement stmt = c.createStatement();

        // create a result that will be used to get the data and translate it into variables
        ResultSet result = stmt.executeQuery("SELECT * FROM city");

        // get number of columns
        ResultSetMetaData rsmd = result.getMetaData();

        // continue sorting through and translating data until there are no more rows of data
        while (result.next()){
            // the 25 and 10 stand for two columns each is translated int its respective data type using
            // the result set
            System.out.println(result.getString("cityname") + result.getDouble("population"));

            // adds one column
            dta.add(result.getString("cityname"));

        }

        System.out.println(dta);

        CityTable.setItems(dta);
        // close the connection
        c.close();
    }catch(Exception e){
        System.out.println("Failed");
        System.out.println(e);

    }

}  

输出:

Executing C:\Users\Allie\Documents\NetBeansProjects\PopulationDatabase_AllieBeckman\dist\run1111906738\PopulationDatabase_AllieBeckman.jar using platform C:\Users\Allie\Desktop\Programs_and_Components\jdk1.8.0_101\jre/bin/java
New York                                          8.5505405E7
Los Angeles                                       3971883.0
Chicago                                           2720546.0
Huston                                            2296224.0
Philladelphia                                     1567442.0
Phoenix                                           1563025.0
San Antonio                                       1469845.0
San Diego                                         1394928.0
Dallas                                            1300092.0
San Jose                                          1026908.0
Austin                                            931830.0
Jacksonville                                      868031.0
San Francisco                                     864816.0
Indianapolis                                      853173.0
Columbus                                          850106.0
Fort Worth                                        833319.0
Charlotte                                         827097.0
Seattle                                           684451.0
Denver                                            682545.0
El Paso                                           681124.0
[New York                                          , Los Angeles                                       , Chicago                                           , Huston                                            , Philladelphia                                     , Phoenix                                           , San Antonio                                       , San Diego                                         , Dallas                                            , San Jose                                          , Austin                                            , Jacksonville                                      , San Francisco                                     , Indianapolis                                      , Columbus                                          , Fort Worth                                        , Charlotte                                         , Seattle                                           , Denver                                            , El Paso                                           ]
Deleting directory C:\Users\Allie\Documents\NetBeansProjects\PopulationDatabase_AllieBeckman\dist\run1111906738

【问题讨论】:

  • 你用什么cellValueFactory s 来处理这些列,你如何访问给定城市名称的人口?
  • 我正在使用预填充的 javaDB 来获取值并尝试传输它们。我找到了答案,并开始使用 CellValueFactory cellData.getValue 从该数据库拉到 TableView 列,谢谢:)

标签: javafx scenebuilder javadb observablelist


【解决方案1】:

感谢 INFOSYS 提供的链接,它帮助我进行了这些更改并找到了我的答案 (http://code.makery.ch/library/javafx-8-tutorial/part2/)

我通过更改 FXML 文件中的一些内容来修复连接,并在代码中添加了几行新行,为了清晰起见,我对其进行了注释。我还需要一个我没有意识到的对象类,现在它可以从我创建的数据库中完美读取。

这里是更改代码:

public class FXMLDocument_PopulationDatabase_AllieBeckmanController implements Initializable {

// connect the TableView from the xml file
@FXML
private TableView<City> CityTable;

// connect the table columns from the xml file
@FXML
private TableColumn<City, String> CityName;
@FXML
private TableColumn<City, String> Population;

// create an observable list to fill with data from DB and populate TableView
private final ObservableList<City> dta = FXCollections.observableArrayList();

@Override
public void initialize(URL url, ResourceBundle rb) {
    try{
        // call the driver used to connect to the database
        Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();

        // connect to the city data base
        Connection c = DriverManager.getConnection("jdbc:derby://localhost:1527/CityDB;create=true", "AllieBeckman", "1122");

        // create a statement used to sort through the data in the database
        Statement stmt = c.createStatement();

        // create a result that will be used to get the data and translate it into variables
        ResultSet result = stmt.executeQuery("SELECT * FROM city");

        // continue sorting through and translating data until there are no more rows of data
        while (result.next()){

            // print each line of data to check if it's right
            System.out.println(result.getString("cityname") + result.getDouble("population"));

            // make a new city object with each row in the database CityDB
            City cty = new City(result.getString("cityname"), "" + result.getDouble("population"));

            // add the new city object to the observable list
            dta.add(cty);
        }

        // print the observable list to make sure it's full
        System.out.println(dta);

        // assign the columns in your tableview to the proper data in the city object
       CityName.setCellValueFactory(cellData -> cellData.getValue().cityname);
       Population.setCellValueFactory(cellData -> cellData.getValue().population);

        // populate the tableview with the observable list
        CityTable.setItems(dta);

        // close the connection
        c.close();

    }catch(Exception e){
        System.out.println("Failed");
        System.out.println(e);
    }
}
}

这是连接它的必要 FXML 代码,我最想念的是。

// I was forgetting to add the fx:id here (citytable)
<TableView fx:id="CityTable" layoutX="39.0" layoutY="64.0" prefHeight="200.0 prefWidth="200.0">
  <columns>
// I was forgetting to add the fx:id here for the columns
    <TableColumn prefWidth="75.0" text="City" fx:id="CityName" />
    <TableColumn prefWidth="75.0" text="Population" fx:id="Population" />
  </columns>
  <items>
    <FXCollections fx:factory="observableArrayList" />
  </items>
</TableView>

理解数据库值的新类

import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

/**
* Model class for a City.
*/
public class City {

public final SimpleStringProperty cityname;
public final SimpleStringProperty population;

/**
 * Default constructor.
 */
public City() {
    this(null, null);
}

/**
 * Constructor with some initial data.
 * 
 * @param cityname
 * @param population
 */
public City(String cityname, String population) {
    this.cityname = new SimpleStringProperty(cityname);
    this.population = new SimpleStringProperty(population);
}

public String getCityName() {
    return cityname.get();
}

public void setCityName(String cityname) {
    this.cityname.set(cityname);
}

public StringProperty cityNameProperty() {
    return cityname;
}

public String getPopulation() {
    return population.get();
}

public void setPopulation(String population) {
    this.population.set(population);
}

public StringProperty populationProperty() {
    return population;
}
}

【讨论】:

    猜你喜欢
    • 2018-04-06
    • 2014-11-02
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    相关资源
    最近更新 更多