如何从我的Jframe按钮调用中访问main中的LinkedList



:::::: 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的作用域。

你必须有三个选项(你有其他的静态声明,但我们不能考虑那些):

  1. 传递需要由类处理的数据,使用类似于@Maraboc post

  2. 的构造函数
  3. 在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概念。

相关内容

  • 没有找到相关文章

最新更新