我更习惯于程序编程,我已经完成的工作基本上有效,但是当我看到它时,我认为它不是非常有效,并且必须有更好的方法来做同样的事情。有人能告诉我它是什么吗?其根源是如何从main.java
加载不同的视图,并根据数据库的内容处理它们。
我正在使用JDBC构建带有Java接口的数据库应用程序。我希望能够为3个不同的用户加载3个不同的GUI,具体取决于哪个用户登录。我最初的尝试是为数据库中的每个表构建一个java bean类,并使用相应的Manager类来处理与数据库的交互。在用户端,我加载了一个登录窗口,让他们尝试访问数据库。当用户输入正确的登录详细信息时,会将这些详细信息保存到名为Session.java
的Singleton类中,以便在他们使用该程序时进行参考,这样我就不必来回查看数据库以进行检查他们的信息。然后使用Singleton类确定要为其加载的适当接口。我是这样从Main.java这样做的:
LoginScreen login = new LoginScreen();
JohnsView john = new JohnsView();
MarysView mary = new MarysView();
PaulsView paul = new PaulsView();
login.setVisible(true);
login.setLocationRelativeTo(null);
//while the user has not completed login hide their database interface screen
while (!Session.isLoginSucessful()) {
john.setVisible(false);
mary.setVisible(false);
paul.setVisible(false);
}
当用户通过GUI输入登录详细信息时,我会检查他们的用户名和密码是否与数据库中的条目匹配。如果是的话,我在名为Session.java
的Singleton类中设置变量
这样:
Session.setTheUserID(user.getIduser());
Session.setTheUserName(user.getUserName());
Session.setTheUserPassword(user.getPassword());
Session.setTheUserLevel(user.getUserLevel());
Session.setTheUserStaffID(user.getStaffID());
Session.setLoginSucessful(true);
然后回到main.java
我使用switch语句到.dispose()
不需要的视图,并使相应的视图显示如下:
//dispose of login once it's finished with
login.dispose();
//get the user 'level (1,2 or 3) from the singleton class...
int usrLev = Session.getTheUserLevel();
//check their level with the switch statement for the appropriate view to load
switch(usrLev) {
case 1:
john.setVisible(true);
mary.dispose();
peter.dispose();
break;
case 2:
mary.setVisible(true);
john.dispose();
peter.dispose();
break;
case 3:
peter.setVisible(true);
mary.dispose();
peter.dispose();
break;
default:
break;
}
我知道我可以用不同的方式解决这个问题,并将登录框放到一个更大的Jframe中,并根据登录的人来操纵Jframe的内容。我在这里回答了其他一些问题时已经看过一些这方面的例子,但这并没有达到我想要的目的。我希望能够根据从数据库派生的变量从Main加载不同的视图。我是否需要某种从main调用的视图管理器类?我已经尝试了几次,但最终删除它,因为它在我尝试时没有意义。我似乎无法在java中解决这个问题。任何帮助理解这一点并回答它是值得赞赏的。
答案 0 :(得分:0)
行。我解决了这个问题虽然不是删除帖子,但我还是把它留给了其他任何比OOP更习惯于程序编程的人。
除了启动应用程序的第一个窗口之外,Main中基本没有任何反应。在我的情况下,登录屏幕。许多人删除main,但我发现保留它很有用,因为我可能想要做一些多线程来处理将来与数据库的通信,如果我将数据库推送到服务器而不是在我的本地机器上。
基本上,上面第3块中的代码在GUI代码中,在按钮操作方法内,处理按钮按下以进行登录。在该方法中,您监听用户的输入,检查它是否与数据库中的内容相匹配。如果它没有通过一些视觉反馈告诉他们。如果它允许代码进入上面的第3个块,那么您加载所需的视图并在当前视图上调用this.dispose()
。
我会离开这一点。如果它不是一个有用的贡献,我将删除它。