私の以前の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>
ここをクリックしてください。おかげで – vially
あなたは実際にコンボボックスに何かを入れていることはありません。 fillCombobox()メソッドを変更して作成したObservableListを返すようにして、初期化メソッドの行を 'comboBox.setItems(loginModel.fillCombobox()); 'に変更してください。 – Geoff
ありがとう。私はちょうどそれをしたが、私はコントローラでコンボボックスを宣言し、あなたが示唆した行を使用するとき、それはエラーを表示しないが、宣言の変数コンボボックスが使用されていないようだ。それは実際には、実際には上記の宣言された実際のコンボボックス変数を使用していないことを意味していると思われます。 – vially