List 在JavaFX表格视图中显示数据库中的项目
好的,我是新手,我已经搜索了两周,试图得到一个SQL结果集打印到JavaFX场景生成器制作的TableView中。我可以使用System.out.println打印结果集,数据是正确的,但当我尝试将其放入列表时,我的tableview显示一列为0,另一列为空。我试图打印列表println,但我得到的是对象指针,而不是数据,因此我看不出是否从结果集错误地传递到列表 任何帮助都将不胜感激。。。我想理解这个概念,而不仅仅是得到一个答案 这是我的控制器代码:List 在JavaFX表格视图中显示数据库中的项目,list,javafx,tableview,resultset,println,List,Javafx,Tableview,Resultset,Println,好的,我是新手,我已经搜索了两周,试图得到一个SQL结果集打印到JavaFX场景生成器制作的TableView中。我可以使用System.out.println打印结果集,数据是正确的,但当我尝试将其放入列表时,我的tableview显示一列为0,另一列为空。我试图打印列表println,但我得到的是对象指针,而不是数据,因此我看不出是否从结果集错误地传递到列表 任何帮助都将不胜感激。。。我想理解这个概念,而不仅仅是得到一个答案 这是我的控制器代码: public class TesterUIC
public class TesterUIController implements Initializable {
@FXML
private TableView<dataClass> Table;
@FXML
private Button TestButton;
@FXML
private TableColumn<dataClass, Integer> colKey;
@FXML
private TableColumn<dataClass, String> colSalesNo;
public static void main (String[] args) {
System.out.println("Main has run");
}
/**
*
* @param fxmlFileLocation
* @param resources
*/
@Override
public void initialize(URL fxmlFileLocation, ResourceBundle resources) {
TestButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Button Pressed");
colKey.setCellValueFactory(new PropertyValueFactory<dataClass, Integer>("Key"));
colSalesNo.setCellValueFactory(new PropertyValueFactory<dataClass, String>("SalesNo"));
Table.getItems().setAll(gobbledyGook());
}
} );
}
/*
* dataClass is a (sub)class representing the data for TableView "Table"
*/
public class dataClass {
private IntegerProperty Key;
public void setKey (int value) {KeyProperty().set(value);}
public int getKey() {
return KeyProperty().get();
}
public IntegerProperty KeyProperty() {
if (Key == null) Key = new SimpleIntegerProperty(this, "Key");
return Key;
}
private StringProperty SalesNo;
public void setSalesNo(String value) {
SalesNoProperty().set(value);
}
public String getSalesNo() {
return SalesNoProperty().get();
}
public StringProperty SalesNoProperty() {
if (SalesNo == null) SalesNo = new SimpleStringProperty(this, "SalesNo");
return SalesNo;
}
}
private List<dataClass> gobbledyGook() { //ObservableList<dataClass> gobbledyGook() { // ResultSet getData() {
Connection conn;
String dbDriver;
Statement st;
ResultSet rs;// = null;
List ll = new LinkedList();
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
dbDriver = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};"
+ "DBQ=Inventario.mdb;";
conn = DriverManager.getConnection(dbDriver, "", "");
st = conn.createStatement();
String getSalesNumber = "SELECT * FROM SalesNumber " // TOP 1 * FROM ...
+ "ORDER BY SalesNumber.Key DESC";// LIMIT 1";
rs = st.executeQuery(getSalesNumber);
while (rs.next()) {
int Key = rs.getInt(1);
double saleNo = rs.getDouble(2);
NumberFormat formatter = new DecimalFormat("###########");
String SalesNo = formatter.format(saleNo);
System.out.println(Key + ", " + SalesNo); //key + ", " + saleNo);
dataClass roww = new dataClass();
ll.add(roww);
}
}
catch (ClassNotFoundException | SQLException ex) {
Logger.getLogger(TesterUIController.class.getName()).log(Level.SEVERE, null, ex);
}
return ll;
}
}
你的问题
您的表是空的,因为您从未初始化您创建的数据类roww的值。请尝试以下代码:
dataClass roww = new dataClass();
roww.setKey(Key);
roww.setSalesNo(SalesNo);
ll.add(roww);
一个更好的想法可能是为dataClass提供一个构造函数,该构造函数将Key和SalesNo作为参数,这样可以保证dataClass实例被正确初始化
ll.add(
new dataClass(
Key,
SalesNo
)
);
参考溶液
这里有一些链接,用于通过JDBC从JavaFX访问数据库,并用结果填充ListView。已为StackOverflow问题创建代码:
该代码与您问题中的代码类似,很容易理解,这就是我链接它的原因,但存在一个缺陷,即数据库查找是在JavaFX应用程序线程上完成的。这意味着在数据库查找过程中应用程序UI被冻结。这不是最优的。为了解决这个问题,我为stackoverflow问题创建了另一个问题:。此解决方案最好使用任务在后台线程上执行查询
旁白
我建议如下,因为这将使您的程序更容易被其他开发人员理解。OMG,谢谢!你的修复工作完美,你的链接帮助我理解我出错的原因!至于命名约定,我知道我没有遵循它们,因为我还没有完全了解它们,但是是的,我正在努力。再次感谢!在两周的追踪中,我找到了最好的帮助!