使用Database JavaFX中的数据填充TableView

时间:2014-11-17 19:15:41

标签: database javafx tableview

我正在尝试使用数据库中的数据填充JavaFX中的TableView。 我一直在尝试很多不同的方法来尝试让事情变得有效。我一直在改变很多事情,但最终我没有得到任何结果。我认为这与我加载FXML文件的方式有关。

我的数据库有3列,所以我不确定是否必须在Artist类的数据库中定义所有内容,这就是为什么它会给我错误。

我使用SceneBuilder构建了GUI,因此我将附加我的FXML文件。

我的主要课程

package application;
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;


public class Main extends Application {
@Override
public void start(Stage stage) throws IOException {
    FXMLLoader loader = new FXMLLoader(Main.class
            .getResource("artistSelection.fxml"));
        Group rootGroup = loader.load();

    final artistSelectionController controller = loader.getController();
    controller.setStage(stage);  
    Scene scene = new Scene(rootGroup,600,400);
    stage.setScene(scene);
    StageStyle stageStyle = StageStyle.TRANSPARENT;
    scene.setFill(Color.TRANSPARENT);
    stage.initStyle(stageStyle);
    stage.show();
}

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

我的控制器类

public class artistSelectionController{

@FXML
private Rectangle rect;

@FXML
private ImageView logo;

@FXML
private HBox buttons;

@FXML
private Button newArtist;

@FXML
private Button closeScreen;

private Stage stage;
private double dragAnchorX;
private double dragAnchorY;

private PreparedStatement preparedStatement;

public void setStage(Stage stage){
    this.stage = stage;
}

@FXML
public void closeScreenHandler(ActionEvent e){
    stage.close();
}

@FXML
public void mousePressedHandler(MouseEvent me) {
    dragAnchorX = me.getScreenX() - stage.getX();
    dragAnchorY = me.getScreenY() - stage.getY();
    }

@FXML
public void mouseDraggedHandler(MouseEvent me) {
    stage.setX(me.getScreenX() - dragAnchorX);
    stage.setY(me.getScreenY() - dragAnchorY);
    }

@FXML
private static TableView<Artist> artistTable;

@FXML
private TableColumn<Artist, String> artistName;

private DBConnect objDbClass;

private Connection con;

private Logger logger;

@FXML
void initialize(){
    // assert artistTable != null : "fx:id=\"tableview\" was not injected: check your FXML file 'UserMaster.fxml'.";
     artistName.setCellValueFactory(
        new PropertyValueFactory<Artist,String>("Artist"));        

    objDbClass = new DBConnect();
    try{
        con = objDbClass.getConnection();
        buildData();
    }
    catch(ClassNotFoundException ce){
        logger.newInput(ce.toString());
    }
    catch(SQLException ce){
        logger.newInput(ce.toString());
    }
}

private ObservableList<Artist> data;

public void buildData(){        
    data = FXCollections.observableArrayList();
    try{      
        String SQL = "Select Name from ARTIST";            
        ResultSet rs = con.createStatement().executeQuery(SQL);  
        while(rs.next()){
            Artist cm = new Artist();                     

            cm.name.set(rs.getString("name"));

            data.add(cm);                  
        }
        artistTable.setItems(data);
    }
    catch(Exception e){
          e.printStackTrace();
          System.out.println("Error on Building Data");            
    }
}


}

我的POJO

package application;
import javafx.beans.property.SimpleStringProperty;

public class Artist {

public SimpleStringProperty name =  new SimpleStringProperty();
public SimpleStringProperty genre = new SimpleStringProperty();

public String getName() {
    return name.get();
}

public String getGenre() {
    return genre.get();
}   
}

我的数据库连接器

import java.sql.*;

public class DBConnect{    
public Connection getConnection() throws ClassNotFoundException, SQLException{       
      Class.forName("com.mysql.jdbc.Driver");
      return DriverManager.getConnection("jdbc:mysql://localhost/myStudio","root","root"); 
    }
}

最后是我的FXML文件

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import javafx.scene.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.paint.*?>
<?import javafx.scene.shape.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.BorderPane?>

<Group fx:id="rootGroup" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application/artistSelectionController">
<children>
  <Rectangle fx:id="rect" arcHeight="50.0" arcWidth="50.0" height="376.0" layoutX="13.0" layoutY="13.0" stroke="BLACK" strokeType="INSIDE" width="577.0">
     <fill>
        <LinearGradient cycleMethod="REPEAT" endX="1.0" endY="1.0" startY="1.0">
           <stops>
              <Stop color="#1b2f36" />
              <Stop color="#1b2f36" offset="0.007662835249042145" />
              <Stop color="#15596e" offset="1.0" />
           </stops>
        </LinearGradient>
     </fill>
  </Rectangle>
  <ImageView fx:id="logo" fitHeight="411.0" fitWidth="606.0" layoutX="13.0" layoutY="13.0" pickOnBounds="true" preserveRatio="true">
     <image>
        <Image url="@../../../../Downloads/myStudio.png" />
     </image>
  </ImageView>
  <TableView fx:id="artistTable" layoutX="316.0" layoutY="143.0" prefHeight="223.0" prefWidth="241.0">
     <columns>
        <TableColumn fx:id="artistName" editable="false" prefWidth="240.0" resizable="false" text="Artists" />
     </columns>
  </TableView>
  <HBox fx:id="buttons" layoutX="65.0" layoutY="339.0" prefHeight="100.0" prefWidth="200.0" spacing="20.0">
     <children>
        <Button fx:id="newArtist" mnemonicParsing="false" prefWidth="75.0" text="New Artist" />
        <Button fx:id="closeScreen" mnemonicParsing="false" prefWidth="75.0" text="Close" />
     </children>
  </HBox>
</children>
</Group>

由于

1 个答案:

答案 0 :(得分:0)

您的代码中似乎存在许多错误。

首先,您已artistTable static。不要这样做 - 根本没有意义,静态字段不会被FXMLLoader注入。这就是你得到空指针异常的原因。

其次,传递给PropertyValueFactory(&#34;艺术家&#34;)的值与模型类Artist中的任何属性的名称不匹配。 (即没有ArtistProperty()方法,也没有getArtist()方法。)

你可能想要

artistName.setCellValueFactory(
        new PropertyValueFactory<Artist,String>("name"));

将列的值与getName()方法联系起来。有关其工作原理的说明,请参阅PropertyValueFactory documentation

(您可能应该根据描述的here描述的JavaFX属性模式来定义您的POJO。但是只有get...()方法才有效。)