首先我知道这是一个重复的问题。但我已经搜索并尝试从谷歌上列出的stackoverflow到quora,但仍然无法解决Get方法仍然返回null的问题。
这是我的类登录模型。com包下的java。你好模型
public class loginModel {
public String username;
public void setUsername(String username) {
this.username = username;
}
public String getUsername() {
return this.username;
}
}
这是我的登录视图。com包下的java。你好看法
import com.hello.model.loginModel;
public class loginView extends javax.swing.JFrame {
loginModel login = new loginModel();
public loginView() {
initComponents();
this.setLocationRelativeTo(null);
loginFunction();
}
private void loginFunction(){
String username = usernameText.getText();
String password = passwdText.getText();
String query = "select * from access where username = '" +username+ "' AND password = '" +password+"'";
databaseConnect db = new databaseConnect();
try (Connection con = DriverManager.getConnection(db.url, db.user, db.password);
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(query)) {
if(rs.next()) {
if(username.equals(rs.getString("username")) && password.equals(rs.getString("password"))){
JOptionPane.showMessageDialog(null, "login Success");
String name = rs.getString("name");
String privilege = rs.getString("privilege");
login.setUsername(name);
menu = new menuView();
menu.setVisible(true);
this.setVisible(false);
}
} else {
JOptionPane.showMessageDialog(null, "username or password incorrect");
}
} catch (SQLException e) {
System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
}
}
我想从menuView调用我的用户名。com包下的java。你好登录成功后查看
import com.hello.model.loginModel;
import com.hello.view.loginView;
public class menuView extends javax.swing.JFrame {
private String username;
loginModel login = new loginModel();
public menuView() {
initComponents();
this.setLocationRelativeTo(null);
initMenu();
}
private void initMenu(){
username = login.getUsername();
JOptionPane.showMessageDialog(this, username);
}
}
根据我在loginModel中调用Get方法时的问题,messagebox返回null。
我尝试过:
我需要在另一个类/包/jframe中使用的值。我做错了吗?
你需要分阶段/步骤思考。登录是一个单一的步骤,它有两个结果之一,成功或失败。
你的应用程序需要执行此步骤,并根据结果采取适当的措施。
您还需要考虑“责任分离”——在这种情况下,执行登录操作并不是loginView
的真正责任,它只是协调用户输入。
责任实际上落在LoginModel
上
// Just a custom exception to make it easier to determine
// what actually went wrong
public class LoginException extends Exception {
public LoginException(String message) {
super(message);
}
}
// LoginModel ... that "does" stuff
public class LoginModel {
private String username;
DatabaseConnect db;
public LoginModel(DatabaseConnect db) {
this.db = db;
}
// I would consider not doing this. You need to ask what reasons would
// the app need this information and expose it only if there is really a
// reason to do so
public String getUsername() {
return username;
}
public boolean isLogedIn() {
return username != null;
}
public void validate(String username, String password) throws SQLException, LoginException {
String query = "select * from access where username = ? AND password = ?";
try ( Connection con = DriverManager.getConnection(db.url, db.user, db.password); PreparedStatement st = con.prepareStatement(query)) {
st.setString(1, username);
st.setString(2, password);
try ( ResultSet rs = st.executeQuery()) {
if (rs.next()) {
this.username = username;
} else {
throw new LoginException("Invalid user credentials");
}
}
}
}
}
这是一个过于简化的例子,因为执行登录的实际责任应该落在控制器身上,控制器随后会生成模型,但我已经超越了自己。
由于应用程序的流程不应由登录视图控制/确定,LoginView
本身应该是一个对话框。这样,它可以在你需要的时候显示出来,它可以执行它需要的任何操作,然后离开,剩下的决策由谁来决定
public class LoginView extends javax.swing.JDialog {
private LoginModel model;
public LoginView(LoginModel model) {
initComponents();
setModal(true);
this.model = model;
this.setLocationRelativeTo(null);
}
// This will get executed when the user taps some kind of "perform login button"
private void loginFunction() {
String username = usernameText.getText();
String password = passwdText.getText();
try {
model.validate(username, password);
dispose()
} catch (SQLException ex) {
// This should probably be considered a fatal error
model = null;
dispose();
} catch (LoginException ex) {
JOptionPane.showMessageDialog(this, "Login vaild");
}
}
}
这意味着你可以把它组合成这样的东西。。。
DatabaseConnect db = new DatabaseConnect();
LoginModel model = new LoginModel(db);
LoginView loginView = new LoginView(model);
// Because we're using a modal dialog, the code execution will wait here
// till the window is disposed/closed
loginView.setVisible(true);
if (loginView.model != null) {
// model is now valid and can continue to be used
// in what ever fashion you need
} else {
JOptionPane.showMessageDialog(null, "Fatal Error");
}
这使您更接近于一个更解耦的解决方案,在这个解决方案中,您可以在类需要时向类提供信息,而不是让类决定应该创建/使用什么。
这也让你离可重用类更近了一步,因为它们只做特定的工作。
您可能会发现花时间阅读“模型-视图-控制器”将帮助您更好地理解这种方法
您的menuView
实例没有使用您在loginView
中实例化的loginModel
类,它使用您在初始化menuView
类中的login
变量时使用new menuView()
创建的新类。您只需要为menuView
类中的loginModel
属性添加一个setter方法,如下所示:
import com.hello.model.loginModel;
import com.hello.view.loginView;
public class menuView extends javax.swing.JFrame {
private String username;
loginModel login = new loginModel();
public menuView() {
initComponents();
this.setLocationRelativeTo(null);
initMenu();
}
private void initMenu(){
username = login.getUsername();
JOptionPane.showMessageDialog(this, username);
}
public void setLogin(loginModel loginModel) {
this.login = loginModel;
}
}
然后在loginView中调用setter。登录功能
如下:
... code before
login.setUsername(name);
menu = new menuView();
menu.setLogin(login);
menu.setVisible(true);
this.setVisible(false);
... code after
请注意,对代码的唯一更改是在menuView
类上添加了setLogin
方法,以及在loginView.loginFunction
中调用menu.setLogin(login)
。
我不太精通摇摆,但我能看到问题,只是不是确切的解决方案。
您的代码在menuView和loginView中创建一个loginModel实例。然后在loginView中设置它拥有的实例中的名称,在menuView中它从自己的实例中获取名称。
您需要创建模型的单个实例并在两个视图之间共享它。
我会以pojo的方式将loginModel传递给构造函数中的两个“视图”。
menu = new menuView(login);
在菜单中查看
public menuView(loginModel login) {
this.login = login;
}
我有一个返回< code>List的方法。现在我想知道如何正确放置< code>try/catch块。如果我将< code>return语句放在< code>try中,我会得到错误 并非所有代码路径都返回值 如果我放置在之后(就像我目前所做的那样),即使在之后,它也会返回。那么最好的方法应该是什么? 方法如下:
我正在尝试实现一个Android应用程序,它启动一个子活动,计算我当前位置的坐标。然而,在尝试将数据发送回MainActivity时,我在onActivityResult方法中得到了一个NullPointerException。以下是两个类: } 编辑:这是我的日志 03-13 13:06:59.940 14638-14638/会面。be2015.gcm\U meetup E/AndroidRun
我在Java中有一个与MySQL连接的多类项目,我可以与这个SQL数据库建立连接,但当我试图将它读入数组时,它得到的是废话,而不是所请求的信息。我做错了什么? 它在sql定义下面出现了一条弯曲的线条,说它们从来没有被读取过,但我就是不明白为什么会这样!它构建得很好,可以看到数据库中有行,但它返回以下内容: 显示“java2assignment3.dvd@5e0010bc”和“java2assign
在Eclipse3.6中运行代码时,我在下面的语句中得到了一个。1: 我读过类似问题的帖子,并尝试过答案,但运气不佳,包括: 使用绝对路径 使用各种相对路径 将gif放入各种文件夹(src、bin、lib等) 创建等待灯。gif- 我当前的图像项目路径是LosOMeter- 有什么想法吗? 堆栈跟踪:
我在尝试将add方法用于ArrayList时出现此错误。我可以看到很多人都有同样的问题,但他们在向arraylist添加元素之前没有初始化arraylist。但我正在尝试添加,而且,我仍然要求控制台返回消息arraylist在方法之前是否为null,并且它返回false。 系统出来println(消息==空);打印错误。我还尝试在开始时初始化messages ArrayList,而不仅仅是声明。有
本文向大家介绍android getActivity.findViewById获取ListView 返回NULL的方法,包括了android getActivity.findViewById获取ListView 返回NULL的方法的使用技巧和注意事项,需要的朋友参考一下 在控件ID正确的情况下,检查是否在实例化布局文件之后,获取LISTVIEW, 先inflate找layout下布局文件,并实例化