我想为弹出菜单动态创建子菜单(两层深)。我可以让第一部分工作:在选择静态菜单时创建第一个动态菜单,但我不知道如何从动态选择的菜单中获取所选项目。这是我的代码:
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;
}
}
答案 0 :(得分:0)
答案很简单:使用getSource()。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);
}
}