java中动态填充的嵌套弹出菜单

时间:2015-02-15 18:35:31

标签: java listener jpopupmenu

我想为弹出菜单动态创建子菜单(两层深)。我可以让第一部分工作:在选择静态菜单时创建第一个动态菜单,但我不知道如何从动态选择的菜单中获取所选项目。这是我的代码:

   private void jMenuAddTransactionLineMenuSelected(javax.swing.event.MenuEvent evt) {                                                     
     //build menu of account classes
     // this code works  my submenu (first level) is created as expected

    jMenuAddTransactionLine.removeAll();
    GL_Account_Class[] accountClasses = null;
    try {
        accountClasses = GL_Account_Class.getAllAccountClasses();
    } catch (GLDataQueryException ex) {
        Logger.getLogger(EditTransaction.class.getName()).log(Level.SEVERE, null, ex);
    }

    for (int ac = 0; ac < accountClasses.length; ac++) {
         jMenuTransactionLineAddLineSelectAccountClass = new JMenu();
        jMenuTransactionLineAddLineSelectAccountClass.setText(accountClasses[ac].getAccountClass() + ":  " + accountClasses[ac].getAccountClassDescription());

        jMenuTransactionLineAddLineSelectAccountClass.addMenuListener(new javax.swing.event.MenuListener() {
        public void menuCanceled(javax.swing.event.MenuEvent evt) {
        }
        public void menuDeselected(javax.swing.event.MenuEvent evt) {
        }
        public void menuSelected(javax.swing.event.MenuEvent evt) {
           jMenuTransactionLineAddLineSelectAccountClassMenuSelected(evt);
        }
    });

        jMenuTransactionLineAddLineSelectAccountClass.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {}
        });


        jMenuAddTransactionLine.add(jMenuTransactionLineAddLineSelectAccountClass);
    }
}                                                    


private void  jMenuTransactionLineAddLineSelectAccountClassMenuSelected(javax.swing.event.MenuEvent evt){
    //This event fires. but I am having difficulty determining which 
    //item the user has selected.  the getSelectedIndex() statement below
    //returns -1

    GL_Account[] accounts = null;
    if (((JMenu)evt.getSource()).getPopupMenu().getSelectionModel().getSelectedIndex() < 0)
    {
        return;
    }

}

1 个答案:

答案 0 :(得分:0)

答案很简单:使用g​​etSource()。getText()(getSource强制转换为JMenu)以下是代码注释,其中一些变量名称已从我原来的问题中更改:

JMenu jMenuSelectAccountClass;
JMenuItem jMenuItemSelectedAccount;
 private void jMenuAddTransactionLineMenuSelected(javax.swing.event.MenuEvent evt) {                                                     
     //build menu of account classes
    jMenuAddTransactionLine.removeAll();
    GL_Account_Class[] accountClasses = null;
    try {
        accountClasses = GL_Account_Class.getAllAccountClasses();
    } catch (GLDataQueryException ex) {
        Logger.getLogger(EditTransaction.class.getName()).log(Level.SEVERE, null, ex);
    }

    for (int ac = 0; ac < accountClasses.length; ac++) {
         jMenuSelectAccountClass = new JMenu();
        jMenuSelectAccountClass.setText(accountClasses[ac].getAccountClass() + ":  " + accountClasses[ac].getAccountClassDescription());

        jMenuSelectAccountClass.addMenuListener(new javax.swing.event.MenuListener() {
        public void menuCanceled(javax.swing.event.MenuEvent evt) {
        }
        public void menuDeselected(javax.swing.event.MenuEvent evt) {
        }
        public void menuSelected(javax.swing.event.MenuEvent evt) {
           jMenuTransactionLineAddSelectAccountClassMenuSelected(evt);
        }
    });




        jMenuAddTransactionLine.add(jMenuSelectAccountClass);
    }
}                                                    


private void  jMenuTransactionLineAddSelectAccountClassMenuSelected(javax.swing.event.MenuEvent evt){
     jMenuSelectAccountClass = (JMenu)evt.getSource();
    jMenuSelectAccountClass.removeAll();


    String accountClass = "";


    accountClass =jMenuSelectAccountClass.getText().split(":")[0];

   GL_Account[] glAccounts = null;

    try {
        glAccounts = GL_Account.getAccountsForClass(accountClass);
    } catch (GLDataQueryException ex) {
        Logger.getLogger(EditTransaction.class.getName()).log(Level.SEVERE, null, ex);
    }

    for (int a = 0; a < glAccounts.length; a++)
    {
         jMenuItemSelectedAccount = new JMenuItem(glAccounts[a].getAccountNumber() + ": " + glAccounts[a].getAccountDescription());

         jMenuItemSelectedAccount.addActionListener(new java.awt.event.ActionListener() {
             public void actionPerformed(java.awt.event.ActionEvent evt) {
             jMenuTransactionLineAddSelectAccountActionPerformed(evt);
             }
         });

         jMenuSelectAccountClass.add(jMenuItemSelectedAccount);
    }
}