【问题标题】:Problems using JMenu with different choices使用具有不同选择的 JMenu 的问题
【发布时间】:2014-08-17 19:27:43
【问题描述】:

我一直在开发 GUI,但在使用 JMenu 时遇到了一些问题。 GUI 位于一个单独的类中,该类从其余类中获取程序的所有操作。我使用菜单的问题是我希望它做两件事:首先,根据用户选择显示正确的面板,其次,等待用户输入以完成所选任务。

根据用户的选择,我已经将它安排成 13 个不同的 if.. else 子句,这部分与显示用户需要输入数据的必要输入选项(面板)一起正常工作。

第二部分,当用户看到正确的面板并想要输入信息(int 和字符串)时,事情并没有按预期进行。程序不会等待用户输入然后根据这些数据采取行动,而是向前推进并继续。由于没有输入数据,不用说,输出不是预期的。

我会提供部分课程,因为它很大。

class Employee implements ActionListener
{
    public void actionPerformed(ActionEvent e) 
    {
        if(e.getActionCommand().equals("1"))
        {
            panelB.setVisible(false);                           
            panelC.setVisible(false);
            panelD.setVisible(false);
            display.setText(bank.infoBank());                       }

else if(e.getActionCommand().equals("2"))
        {
            panelB.setVisible(true);                            //Show all panels
            panelC.setVisible(true);
            panelD.setVisible(true);
            label2.setText("Accountnumber:   ");
            text2.setText("");
            display.setText("");


        }

        ...


else if(e.getActionCommand().equals("5"))
        {
            panelB.setVisible(true);
            panelC.setVisible(false);
            panelD.setVisible(true);
            display.setText("");


            if(e.getActionCommand().equals("Ok")  && !pNrText.getText().isEmpty())  //This is a JButton that when pressed should send the data to the method
            {
                if(checkInput(pNrText) == true)  //Method to validate input
                {
                    pNr = Long.parseLong(pNrText.getText());  //pNr is an input field
                    bank.addSavingsAccount(pNr); //this is a method from another class
                }
                else
                {
                    JOptionPane.showMessageDialog(null, "Only digits permitted!");
                }
            }

最后一部分(actioncommand 等于 5)是程序在继续之前不等待用户输入任何内容的地方之一,因此根本不会接收任何输入来处理。

这是围绕不同 JMenu 构建的 ATM 程序的一部分,在另一个使用 JRadioButton 的地方,它按预期工作,但我无法使用 JMenu 让它工作,我不想使用 JRadioButton有很多选择(13)。

非常感谢任何输入! /约翰

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。见How to create a Minimal, Complete, and Verifiable example
  • Use Actions for menuitems, rather than ActionListener。或者至少为您的菜单项使用单独的 ActionListener。
  • 鉴于文本不包含?,它提示我问 - 我们的问题是什么? +1 也向@DavidPostill 提出 MCVE 建议。
  • @DavidPostill 所需的输出是使用用户输入来处理信息,输入是金额或银行帐号或社会保险号(所有整数)。换句话说,为方法提供参数。最常见的“错误行为”是编译器将空白输入解释为无效输入,因此无法正确执行该方法。

标签: java swing user-interface jmenu


【解决方案1】:

“这最后一部分(actioncommand 等于 5)是程序在继续之前不等待用户输入任何内容的地方之一,因此根本没有收到任何输入来处理。”

else if(e.getActionCommand().equals("5")) {

    panelB.setVisible(true);
    panelC.setVisible(false);
    panelD.setVisible(true);
    display.setText("");

    if(e.getActionCommand().equals("Ok") {

我不知道您为什么会期望这种行为。这不是扫描仪等待输入的控制台程序。事件驱动的编程不是这样工作的。一个事件得到一个响应。没有等待。 actionPerformed 中的所有内容只发生一次。这意味着当您按下5 时,相应的if 将执行。 OK-if 永远不会被执行,因为没有任何事件会到达它,因为它被困在5-if 中。快速修复,将OK-block 赋予它自己的else-if5-if 处于同一级别

就像我在评论中所说的那样。避免所有这些 if 语句。为每个菜单项添加一个匿名侦听器。

okItem.addActionListener(new ActionListener(){
    public void actionPerforemd(ActionEvent e) {

    }
});

但您甚至可以超越这一点并使用Action。出于多种原因,就我个人而言,我更喜欢这条路线。


顺便说一句,您应该使用CardLayout 在面板之间切换。

【讨论】:

  • 谢谢,我一定会检查动作,直到现在才使用 actionListener。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多