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

时间:2015-05-21 08:10:56

标签: java swing user-interface netbeans jframe

::::::更新:::::

我尝试更新我的JFrame以将LinkedList作为参数,它看起来像......

 public userLogin(LinkedList<dataUser> ll) {
    initComponents();
 }

我的主要是现在称它为......

userLogin frame = new userLogin(userLL);
frame.setVisible(true);

仍然无法在我的JFrame

中使用LinkedList userLL

:::::: 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中声明它会允许访问,但它现在似乎是本地的主要。

4 个答案:

答案 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的范围不知道用户登录类。

你必须选择(你有其他人使用静态声明,但我们不能考虑那些):

  1. 使用像@Maraboc post

  2. 这样的构造函数传递您需要处理的数据。
  3. 在UserLogin类中创建一个setter方法来设置列表或其他数据,但是您需要确保在需要时设置数据。

  4. 还有其他选项可以在程序上下文中为类提供外部数据。使用一些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。