2016-12-02 8 views
0

私のテーブルビューに問題があります。私のデータベースにアイテムを追加するたびに、それは私のテーブルビューに表示されますが、私はテーブルビューを閉じて再オープンした後にのみ表示されます。しかし、私はそれを追加した直後に私のテーブルビューに追加したいと思います。だから私はリフレッシュメソッドを作ったが、私はそこからエラーを取得しています。コードにコメントを追加しました。ここで問題がどこで発生するか説明しています。コンストラクタメソッドがなく、コンストラクタメソッドのエラーが発生したときのエラー

ここで私は削除している輸入品と

package packet; 



public class DataControll implements Initializable { 



    private static Connection con; 
    private static Statement stat; 
    private PreparedStatement prep; 
    ResultSet rs = null; 

    private ObservableList<Toidubaas> toidudata; 

    public void eemaldaListist() { 

    } 

    public void lisaNupp(ActionEvent event) { 

     try { 
      String query = "INSERT OR IGNORE INTO Toiduinfo (Toidu, Kalorid, Valgud, Süsivesikud, Rasvad) VALUES(?, ?, ?, ?, ?)"; 
      prep = con.prepareStatement(query); 

      prep.setString(1, lisaToit.getText()); 
      prep.setInt(2, Integer.parseInt(lisaKcal.getText())); 
      prep.setInt(3, Integer.parseInt(lisaValk.getText())); 
      prep.setInt(4, Integer.parseInt(lisaSysi.getText())); 
      prep.setInt(5, Integer.parseInt(lisaRasv.getText())); 
      prep.execute(); 
      prep.close(); 
     } catch (Exception er) { 
      System.out.println(er.getMessage()); 
     } 

     clearForm(); 
    } 

    private void clearForm() { 
     lisaToit.clear(); 
     lisaKcal.clear(); 
     lisaValk.clear(); 
     lisaSysi.clear(); 
     lisaRasv.clear(); 
    } 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     toidudata = FXCollections.observableArrayList(); 

     tbCal.setCellValueFactory(new PropertyValueFactory<Toidubaas, Integer>("rbCal")); 
     tbProt.setCellValueFactory(new PropertyValueFactory<Toidubaas, Integer>("rbProt")); 
     tbCarb.setCellValueFactory(new PropertyValueFactory<Toidubaas, Integer>("rbCarb")); 
     tbFat.setCellValueFactory(new PropertyValueFactory<Toidubaas, Integer>("rbFat")); 
     tbMeal.setCellValueFactory(new PropertyValueFactory<Toidubaas, String>("rbMeal")); 



     try { 

      con = DriverManager.getConnection("jdbc:sqlite:Fooditabel.sqlite"); 
      stat = con.createStatement(); 
      stat.executeUpdate(
        "CREATE TABLE IF NOT EXISTS Toiduinfo (Toidu TEXT, Kalorid INTEGER, Valgud INTEGER, Süsivesikud INTEGER, Rasvad INTEGER)"); 

      ResultSet rs = con.createStatement() 
        .executeQuery("SELECT Toidu, Kalorid, Valgud, Süsivesikud, Rasvad FROM Toiduinfo"); 
      while (rs.next()) { 
       Toidubaas nt = new Toidubaas(); //if i add constructor method, im getting error here, saying the constructor is undefined 

       nt.rbMeal.set(rs.getString("Toidu")); 
       nt.rbCal.set(rs.getInt("Kalorid")); 
       nt.rbProt.set(rs.getInt("Valgud")); 
       nt.rbCarb.set(rs.getInt("Süsivesikud")); 
       nt.rbFat.set(rs.getInt("Rasvad")); 
       toidudata.add(nt); 
      } 

      tbTabelview.setItems(toidudata); 

     } catch (SQLException ex) { 
      System.out.println(ex.getMessage()); 
      ; 
     } 
    } 

    public void refreshTable() { 
     toidudata.clear(); 
     try { 
      String query = "Select * FROM Toiduinfo"; 
      prep = con.prepareStatement(query); 
      rs = prep.executeQuery(); 

      while (rs.next()) { 
       toidudata.add(new Toidubaas( //Getting error here, if im not using constructor method, saying the method is undefined. 
        rs.getString("Toidu"), 
        rs.getInt("Kalorid"), 
        rs.getInt("Valgud"), 
        rs.getInt("Süsivesikud"), 
        rs.getInt("Rasvad"))); 
       tbTabelview.setItems(toidudata); 
      } 
      prep.close(); 
     } catch (Exception e2) { 

     } 
    } 
} 

@FXMLタグとは、コンストラクタメソッドを持つクラスです。私のプログラムがテーブルビューにデータベースデータを入力するように、コンストラクタメソッドがコメントアウトされていることに注意してください。

public class Toidubaas { 

    public SimpleIntegerProperty rbCal = new SimpleIntegerProperty(); 
    public SimpleIntegerProperty rbProt = new SimpleIntegerProperty(); 
    public SimpleIntegerProperty rbCarb = new SimpleIntegerProperty(); 
    public SimpleIntegerProperty rbFat = new SimpleIntegerProperty(); 
    public SimpleStringProperty rbMeal = new SimpleStringProperty(); 

//This is the constructor method 

     /*public Toidubaas(String sbMeal, Integer sbCal, Integer sbProt, Integer sbCarb, Integer sbFat) { 

     this.rbMeal = new SimpleStringProperty(sbMeal); 
     this.rbCal = new SimpleIntegerProperty(sbCal); 
     this.rbProt = new SimpleIntegerProperty(sbProt); 
     this.rbCarb = new SimpleIntegerProperty(sbCarb); 
     this.rbFat = new SimpleIntegerProperty(sbFat); 

    }*/ 

    public String getRbMeal() { 
     return rbMeal.get(); 
    } 

    public void setRbMeal(String v) { 
     rbMeal.set(v); 
    } 

    public Integer getRbCal() { 
     return rbCal.get(); 
    } 

    public void setRbCal(Integer v) { 
     rbCal.set(v); 
    } 

    public Integer getRbProt() { 
     return rbProt.get(); 
    } 

    public void setRbProt(Integer v) { 
     rbProt.set(v); 
    } 

    public Integer getRbCarb() { 
     return rbCarb.get(); 
    } 

    public void setRbCarb(Integer v) { 
     rbCarb.set(v); 
    } 

    public Integer getRbFat() { 
     return rbFat.get(); 
    } 

    public void setRbFat(Integer v) { 
     rbFat.set(v); 
    } 



} 
+1

はあなたが合格しない第二のコンストラクタを作成します'public Toidubaas(){}' – XtremeBaumer

+0

"しかし、そこからエラーが出ています" - そのエラーはどうなりますか?コンパイル時?例外?エラーメッセージには何が表示されますか? – JimmyB

+0

@XtremeBaumerは、十分に異なるパラメータを持つ限り、各クラスに複数のコンストラクタを持つことができることに注意してください。必要に応じて宣言し、必要に応じてどちらか一方を使用してください。 – JimmyB

答えて

0

あなたがここで求めていることは本当に混乱しています。コード内のコメントを残すのではなく、実際のエラーテキストを投稿することをおすすめします。

だから、2つの別々の方法でToidubaasを使用しようとしている:

まず(空のコンストラクタ)

Toidubaas nt = new Toidubaas(); //if i add constructor method, im getting error here, saying the constructor is undefined 

nt.rbMeal.set(rs.getString("Toidu")); 
nt.rbCal.set(rs.getInt("Kalorid")); 
nt.rbProt.set(rs.getInt("Valgud")); 
nt.rbCarb.set(rs.getInt("Süsivesikud")); 
nt.rbFat.set(rs.getInt("Rasvad")); 
toidudata.add(nt); 

セカンド(パラメータ化されたコンストラクタ)

toidudata.add(new Toidubaas( //Getting error here, if im not using constructor method, saying the method is undefined. 
rs.getString("Toidu"), 
rs.getInt("Kalorid"), 
rs.getInt("Valgud"), 
rs.getInt("Süsivesikud"), 
rs.getInt("Rasvad"))); 
tbTabelview.setItems(toidudata); 

ありますこれを処理する2つの方法:あなたのアクセス方法を標準化するかこれ(IE:コードを最初から2番目に変更する、またはその逆)、または両方の方法をサポートします。

Toidubaas

public class Toidubaas { 

    public SimpleIntegerProperty rbCal = new SimpleIntegerProperty(); 
    public SimpleIntegerProperty rbProt = new SimpleIntegerProperty(); 
    public SimpleIntegerProperty rbCarb = new SimpleIntegerProperty(); 
    public SimpleIntegerProperty rbFat = new SimpleIntegerProperty(); 
    public SimpleStringProperty rbMeal = new SimpleStringProperty(); 

    //Empty Constructor (only need this if standardized to first approach) 
    public Toidubaas() {} 

    //Parameterized Constructor (only need this if standardized to second approach) 
    public Toidubaas(String sbMeal, Integer sbCal, Integer sbProt, Integer sbCarb, Integer sbFat) { 

     rbMeal.set(sbMeal); 
     rbCal.set(sbCal); 
     rbProt.set(sbProt); 
     rbCarb.set(sbCarb); 
     rbFat.set(sbFat);  
    } 

    //Getters/Setters 
    ... 
} 
0

あなたはパラメータを持つコンストラクタを追加したくない場合は、値にセッターを呼び出すことによって、一つ一つを設定します。コンストラクタをオーバーロードすることもできます(ただし、プロパティを複数回作成しないでください)。

あなたはあなたがが修正するために非常に簡単である、成功したデータを提出する場合には、それを追加したことがないので、行が、TableViewに追加されません。

String query = "INSERT OR IGNORE INTO Toiduinfo (Toidu, Kalorid, Valgud, Süsivesikud, Rasvad) VALUES(?, ?, ?, ?, ?)"; 

try (PreparedStatement prep = con.prepareStatement(query)) { 
    String toidu = lisaToit.getText(); 
    int kalorid = Integer.parseInt(lisaKcal.getText()); 
    int valgud = Integer.parseInt(lisaValk.getText()); 
    int süsivesikud = Integer.parseInt(lisaSysi.getText()); 
    int rasvad = Integer.parseInt(lisaRasv.getText()); 

    prep.setString(1, toidu); 
    prep.setInt(2, kalorid); 
    prep.setInt(3, valgud); 
    prep.setInt(4, süsivesikud); 
    prep.setInt(5, rasvad); 

    if (prep.executeUpdate() > 0) { 
     // object filled with data from input data 
     Toidubaas newToidubaas = new Toidubaas(toidu, 
               kalorid, 
               valgud, 
               süsivesikud, 
               rasvad); 

     // add new item to table here 
     toidudata.add(newToidubaas); 
    } 
    clearForm(); 
} catch (Exception er) { 
    System.out.println(er.getMessage()); 
} 
関連する問題