2016-07-26 3 views
1

私の以前のjavafxプログラムをMVCマシンに変換しようとしています。私は実際にはコンパイルエラーもなく、実行時エラーもありません。しかし、私は私のログインアプリケーションを実行すると、私はコンボボックスのデータベース値を見ることができません。javafxとデータベースソース(ここではSQLite)でコンボボックスにMVCパターンを適用する方法

もちろん、私はログインできますが、正常に動作します。

これはLoginView、LoginControllerにsplitedコンボボックスのための私のコードであり、そしてLoginModel:

package com.login; 

import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.control.ComboBox; 

import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

/** 
* Created by DELL PC on 7/25/2016. 
*/ 
public class LoginModel { 
    Connection connection; 

    PreparedStatement preparedStatement = null; 
    ResultSet resultSet = null; 

    public LoginModel() 
    { 
     connection = SqliteConnection.connector(); 

     if(connection == null) 
     { 
     System.exit(1); 
    } 
} 

    public boolean isDBConnected() 
    { 
    try { 
     return !connection.isClosed(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
     return false; 
    } 
} 

public ComboBox fillCombobox() 
{ 
    try 
    { 
     final ObservableList options = FXCollections.observableArrayList(); 
     String query = "SELECT role from admin"; 
     preparedStatement = connection.prepareStatement(query); 
     resultSet = preparedStatement.executeQuery(); 

     while(resultSet.next()) 
     { 
      options.add(resultSet.getString("role")); 
     } 
     preparedStatement.close(); 
     resultSet.close(); 
    } 
    catch(SQLException ex) 
    { 
     Logger.getLogger(LoginModel.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return null; 
} 

public boolean isLogin(String user, String pass) throws SQLException 
{ 
    String query = "SELECT * FROM admin WHERE username = ? and password = ?"; 

    try { 
     preparedStatement = connection.prepareStatement(query); 
     preparedStatement.setString(1, user); 
     preparedStatement.setString(2, pass); 

     resultSet = preparedStatement.executeQuery(); 
     if(resultSet.next()) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 

    }catch(Exception e){ 
     return false; 
    } 
    finally 
    { 
     preparedStatement.close(); 
     resultSet.close(); 
    } 
} 

}

コントローラ

のコード
package com.login; 

import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.fxml.Initializable; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.control.ComboBox; 
import javafx.scene.control.Label; 
import javafx.scene.control.PasswordField; 
import javafx.scene.control.TextField; 
import javafx.scene.layout.Pane; 
import javafx.stage.Stage; 

import java.io.IOException; 
import java.net.URL; 
import java.sql.SQLException; 
import java.util.ResourceBundle; 

public class LoginController implements Initializable{ 

    public LoginModel loginModel = new LoginModel(); 

    @FXML 
    private TextField txtusername; 

    @FXML 
    private PasswordField pwpaswword; 

    @FXML 
    private Label isConnected; 

    @FXML 
    private ComboBox comboBox; 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 

     comboBox.getItems().contains(loginModel.fillCombobox()); 

    if(loginModel.isDBConnected()) 
    { 
     isConnected.setText("Connected"); 
    } 
    else 
    { 
     isConnected.setText("Not Connected"); 
    } 
} 

public void Login(ActionEvent event) 
{ 
    try { 
      if (loginModel.isLogin(txtusername.getText(), pwpaswword.getText())) 
      { 
       isConnected.setText("Login Successfully "); 

       ((Node)event.getSource()).getScene().getWindow().hide(); 

       Stage window = new Stage(); 
       FXMLLoader loader = new FXMLLoader(); 
       Pane root = loader.load(getClass().getResource("CivilStateView.fxml").openStream()); 

       CivilStateController civilStateController = (CivilStateController)loader.getController(); 
       civilStateController.getUser(txtusername.getText()); 

       Scene scene = new Scene(root); 
       window.setTitle("Hello World"); 
       window.setScene(scene); 
       window.show(); 
      } 
      else 
      { 
       isConnected.setText("Login Unsuccessful"); 
      } 
     } catch (SQLException e) { 
      isConnected.setText("Exception occurred:" + e); 
      e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

}

図でありますfxmlで作成:

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

<?import javafx.geometry.*?> 
<?import javafx.scene.text.*?> 
<?import javafx.scene.control.*?> 
<?import java.lang.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.geometry.Insets?> 
<?import javafx.scene.layout.GridPane?> 
<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.Label?> 

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="346.0" prefWidth="360.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.login.LoginController"> 
    <children> 
     <Label fx:id="isConnected" layoutX="31.0" layoutY="30.0" prefHeight="36.0" prefWidth="150.0" text="Status" textFill="#f20f0f"> 
    <font> 
     <Font size="18.0" /> 
    </font> 
    </Label> 
    <TextField fx:id="txtusername" layoutX="26.0" layoutY="75.0" prefHeight="48.0" prefWidth="160.0" promptText="Username"> 
    <font> 
     <Font size="19.0" /> 
    </font> 
    </TextField> 
    <PasswordField fx:id="pwpaswword" layoutX="26.0" layoutY="137.0" prefHeight="48.0" prefWidth="160.0" promptText="Password"> 
    <font> 
     <Font size="19.0" /> 
    </font> 
    </PasswordField> 
    <ComboBox fx:id="comboBox" layoutX="26.0" layoutY="196.0" prefHeight="36.0" prefWidth="150.0"> 
      <padding> 
      <Insets left="20.0" /> 
      </padding> 
     </ComboBox> 
     <Button layoutX="26.0" layoutY="245.0" mnemonicParsing="false" onAction="#Login" prefHeight="36.0" prefWidth="68.0" text="Button" /> 
    </children> 
</AnchorPane> 
+0

ここをクリックしてください。おかげで – vially

+0

あなたは実際にコンボボックスに何かを入れていることはありません。 fillCombobox()メソッドを変更して作成したObservableListを返すようにして、初期化メソッドの行を 'comboBox.setItems(loginModel.fillCombobox()); 'に変更してください。 – Geoff

+0

ありがとう。私はちょうどそれをしたが、私はコントローラでコンボボックスを宣言し、あなたが示唆した行を使用するとき、それはエラーを表示しないが、宣言の変数コンボボックスが使用されていないようだ。それは実際には、実際には上記の宣言された実際のコンボボックス変数を使用していないことを意味していると思われます。 – vially

答えて

0

DBインタラクションのいずれも使用していませんが、これを実行するテストケースを作成することができました。重要な部分は次のとおりです。

public class LoginModel { 
    ... 
    public ObservableList fillCombobox() { 
     ObservableList options = FXCollections.observableArrayList(); 
     // replace this with your DB code to add the options. 
     for (int i = 1; i < 10; i++) { 
      options.add("Role " + i); 
     } 
     // 
     return options; 
    } 
} 

public class LoginController implements Initializable { 
    ... 
    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     comboBox.setItems(loginModel.fillCombobox()); 
     ... 
    } 
} 
+0

私は別の問題があります – vially

+0

別の問題がある場合は、新しい質問を作成する必要があります。彼らが問題を解決して他の人があなたのために答えを見つけようとする傾向がないように答えを受け入れることも良い考えです。 – Geoff

+0

確かに私の質問に答えるあなたの試みはGoeffの大成功でした。私の謝罪はこれまで言及していない。私は本当に感謝することができました。 – vially

関連する問題