:::::: UPDATE:::::
我尝试更新我的JFrame
以LinkedList作为参数,它看起来像…
public userLogin(LinkedList<dataUser> ll) {
initComponents();
}
我的main现在通过…
userLogin frame = new userLogin(userLL);
frame.setVisible(true);
仍然不能使用我的JFrame
内的LinkedList userLL
:::::: END UPDATE::::::
这是我第一次使用netbeans和GUI生成器。我有一个类TaskManager
,我使用作为我的主要类。这个类创建了几个LinkedList
s,并像这样调用我的第一个JFrame
GUI:
public static void main(String[] args) {
LinkedList<dataUser> userLL = new LinkedList<dataUser>(); //creates a LL for userData
LinkedList<task> taskLL = new LinkedList<task>(); //creates a LL for taskData
LinkedList<task> progressLL = new LinkedList<task>(); //creates a LL for in progress tasks
LinkedList<task> completeLL = new LinkedList<task>(); //creates a LL for completed tasks
userLogin frame = new userLogin();
frame.setVisible(true);
然而,在我的userLogin
中我不能访问我创建的userLL
。下面是提交按钮内的代码:
private void submitBActionPerformed(java.awt.event.ActionEvent evt) {
String user = jTextField1.getText();
String userPW = jTextField2.getText();
try {
//below userLL is not accessible because it can't be found.
dataUser.userDataSearch(userLL, userPW);
}
catch (Exception e) {
JOptionPane.showMessageDialog(this, "was not found", "error", JOptionPane.ERROR_MESSAGE);
return;
}
}
正如代码中的注释所述,我无法运行该函数,因为我无法访问userLL
(我在启动此JFrame
的主程序中创建的LinkedList
)。
我是否必须将LinkedList
传递到我的JFrame
中作为它能够使用它的参数?我以为在main中声明它会允许访问,但现在它似乎是main的本地。
您必须像这样将userLL
作为参数传递给userLogin
类:
public class userLogin {
LinkedList<dataUser> userLL
public userLogin(List userLL){
this.userLL = userLL;
}
//.......
}
在你的主类中,像这样实例化它:userLogin frame = new userLogin(userLL);
您创建了一个扩展JFrame的类userlogin(这个神奇的功能是由Netbeans完成的)。main类只是程序的入口点,userlogin类不知道main的作用域。
你必须有三个选项(你有其他的静态声明,但我们不能考虑那些):
-
传递需要由类处理的数据,使用类似于@Maraboc post
的构造函数 在UserLogin类中创建一个setter方法来设置列表或其他数据,但您需要确保在需要时将设置数据。
在程序的上下文中,还有其他选项可以使类获得外部数据。使用一些单例模式(例如:GlobalDataStorageSingleton),根据SOLID范例,这可能是一个糟糕的设计。
你可以在OOP中查看SOLID vs STUPID原则。
最好佩德罗
有两个选项可以解决这个问题。
-
您已经提到了第一个:传递
LinkedList
(无论是在构造函数中还是之后,通过一些setter方法)。 -
第二种选择是将
LinkedList
声明为主类的对象变量,并使用getter访问它。如果没有对主类对象的引用,那么静态变量应该可以完成这个任务(如果只有一个LinkedList
实例)。
我绝对推荐选项1,因为这是的标准方式,并且访问列表的受限方式更好。
你不能访问在main()类中创建的列表。您必须将它们作为参数传递给已创建的UserLogin类。
类似:
public class UserLogin
{
private final LinkedList<datauser> ll1;
private final LinkedList<task> taskLL;
private final LinkedList<task> progressLL;
private final LinkedList<task> completeLL;
public class UserLogin(LinkedList<datauser> ll1, LinkedList<task> taskLL, LinkedList<task> progressLL, LinkedList<task> completeLL)
{
this.ll1 = ll1;
this.taskLL = taskLL;
this.progressLL = progressLL;
this.completeLL = completeLL;
}
//now you should be able to use the linked lists within the event handler
private void submitBActionPerformed(java.awt.event.ActionEvent evt) {
String user = jTextField1.getText();
String userPW = jTextField2.getText();
try {
//below userLL is not accessible because it can't be found.
dataUser.userDataSearch(userLL, userPW);
}
catch (Exception e) {
JOptionPane.showMessageDialog(this, "was not found", "error", JOptionPane.ERROR_MESSAGE);
return;
}
}
基于op的注释进行更新。在main方法中初始化UserLogin,如下所示:
public static void main(String[] args)
{
LinkedList<datauser> ll1 = new LinkedList<datauser>();
LinkedList<datauser> taskLL = new LinkedList<datauser>();
LinkedList<datauser> progressLL = new LinkedList<datauser>();
LinkedList<datauser> completeLL = new LinkedList<datauser>();
//feed data within the above linked lists..
...
//initialize the user login class with the linked lists you created
UserLogin userLogin = new userLogin(ll1,taskLL, progressLL, completeLL);
}
总的来说,如果你以前没有广泛地使用过Java,你可能想看看与对象创建相关的核心Java概念。