::::::更新:::::
我尝试更新我的JFrame
以将LinkedList作为参数,它看起来像......
public userLogin(LinkedList<dataUser> ll) {
initComponents();
}
我的主要是现在称它为......
userLogin frame = new userLogin(userLL);
frame.setVisible(true);
仍然无法在我的JFrame
:::::: END UPDATE ::::::
这是我第一次使用netbeans和GUI构建器。我有一个课程TaskManager
,我将其用作我的主要课程。这个类创建了一些LinkedList
并调用我的第一个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
(我在主程序中创建的LinkedList
启动此JFrame
LinkedList
1}})。
我是否必须将JFrame
传入我的Swiperefreshlayout
作为论据才能使用它?我假设在main中声明它会允许访问,但它现在似乎是本地的主要。
答案 0 :(得分:3)
您必须将userLL
作为参数传递给userLogin
类,如下所示:
public class userLogin {
LinkedList<dataUser> userLL
public userLogin(List userLL){
this.userLL = userLL;
}
//.......
}
在你的主类中实例化它:userLogin frame = new userLogin(userLL);
答案 1 :(得分:2)
您创建了一个扩展JFrame的类userlogin(这个魔术由Netbeans完成)。主类只是程序的入口点,main的范围不知道用户登录类。
你必须选择(你有其他人使用静态声明,但我们不能考虑那些):
使用像@Maraboc post
在UserLogin类中创建一个setter方法来设置列表或其他数据,但是您需要确保在需要时设置数据。
还有其他选项可以在程序上下文中为类提供外部数据。使用一些Singleton模式(例如:GlobalDataStorageSingleton)根据SOLID范例可能是一个糟糕的设计。
您可以在OOP中查看SOLID与STUPID原则。
最佳佩德罗
答案 2 :(得分:1)
有两种方法可以解决这个问题。
您已经提到了第一个:传递LinkedList
(在构造函数中或稍后,通过某些setter方法)。
第二个选项是声明LinkedList
主类的对象变量并使用getter访问它。如果你没有对主类对象的引用,那么静态变量就应该有效(如果只有LinkedList
的一个实例。
我肯定会推荐选项1,因为它是的标准方式,并且对列表的访问受到更好的限制。
答案 3 :(得分: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。