一个基于用户输入调用成员函数的 JButton

Posted

技术标签:

【中文标题】一个基于用户输入调用成员函数的 JButton【英文标题】:One JButton to call member functions based on user input 【发布时间】:2012-08-02 22:46:36 【问题描述】:

给定一个 GUI 应用程序,用户将选择两个单选按钮之一,JRadioButton aJRadioButton b。根据他的选择,他将输入不同的输入。但是,要计算公式,他会单击常规按钮JButton c

但是,当在 ActionListener 中调用两个以上的成员函数时,就会出现问题。

c = new JButton("c"); c.addActionListener(新的ActionListener() @覆盖 公共无效actionPerformed(ActionEvent e) cActionPerformed(e); );

对于ActionEvent,我们有,

公共无效cActionPerformed(ActionEvent ev) 尝试 双 f = foo.blah(x, y); 双 b = bar.meh( y, z ); 捕捉(NumberFormatException e) JOptionPane.showConfirmDialog( null, "错误消息。", "错误", JOptionPane.CANCEL_OPTION );

但是,程序只在调用堆栈中下降了一层,返回了catch 异常对话框。如何使当用户按下按钮c 时,根据选择ab,他分别得到fb

【问题讨论】:

For within the ActionEvent, we have, 最好是发布SSCCE 上下文不足:必须针对给定的点击同时评估 blahmeh 吗? xz 是否互斥?输入时可以输入verified 吗? 抛出了什么异常? 【参考方案1】:

您可以使用继承自EventObjectgetSource() 方法来区分事件的来源。

例子:

  public void actionPerformed(ActionEvent event) 
    if (event.getSource() == button1) 
      setSize(300, 200);
      doLayout();
     else if (event.getSource() == button2) 
      setSize(400, 300);
      doLayout();
     else if (event.getSource() == button3) 
      setSize(500, 400);
      doLayout();
    

【讨论】:

但是 getSource() 将返回单击的按钮。不是被选中的单选按钮..【参考方案2】:

您可以使用单选按钮的isSelected() 选项。

JRadioButton f = new JRadioButton();
JRadioButton b = new JRadioButton();

public void cActionPerformed( ActionEvent ev ) 
      try 
        if(f.isSelected())

            double f = foo.blah( x, y );

          else if(b.isSelected())

            double b = bar.meh( y, z );

          else  // If none is selected
            // Do something
         
      
      catch( NumberFormatException e ) 
        JOptionPane.showConfirmDialog(
        null, "Error message.", "Error", JOptionPane.CANCEL_OPTION
        );
    

【讨论】:

它抛出了我在catch 块中声明的异常。 你确定这是相关的吗?这个异常是从哪里抛出的?富和酒吧?是什么原因造成的?【参考方案3】:

程序进入catch 块的问题与确定选择了哪个单选按钮无关。它可以进入 catch 块的唯一方法是抛出 NumberFormatException。可以抛出NumberFormatException 的唯一方法是它来自foo.blah( x, y );bar.meh( y, z );

所以 - 您需要首先弄清楚为什么您的函数会抛出该异常。然后你就可以应用 La bla bla 的答案了。

找出错误所在的一个好方法是在您的catch 中使用e.printStackTrace()。这会将堆栈跟踪打印到控制台输出,指向导致问题的确切代码行。

【讨论】:

java.lang.NumberFormatException: empty String at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source) at java.lang.Double.parseDouble(Unknown Source) at foobar.cActionPerformed(foobarFrame.java:86) at foobar$3.actionPerformed(foobarFrame.java:54) ... 所以“LoanCalculatorFrame”类的第 86 行抛出了异常。该行是哪种方法?我们可以看到该方法的源代码吗?我猜您正在使用该方法将字符串转换为数字。这就是 java 文档关于这个异常的说法:“抛出以表明应用程序已尝试将字符串转换为一种数字类型,但该字符串没有适当的格式。” double amt = Double.parseDouble( loanTextField.getText() ); 所以问题是 loanTextField 中的文本不能被解析为双精度,因为它的格式不正确。如果您将文本打印到控制台窗口,您可能会看到问题(使用System.out.println("'" + loanTextField.getText() + "'"); - 这样您就可以看到末尾的任何额外空格) 对不起 - 我一定是歪曲了我的意图。我愿意牵着你的手帮助你解决问题,因为这是一次很好的学习经历(对你来说)。我认为我们已经找到了问题 - 您尝试转换为数字的文本框中有空格或 % 或一些非数字字符。我很确定您可以从这里弄清楚...(这将不是这些字符之一:0123456789-.)我现在要睡觉了-祝您找到罪魁祸首!

以上是关于一个基于用户输入调用成员函数的 JButton的主要内容,如果未能解决你的问题,请参考以下文章

没有对象不能调用成员函数

在成员函数中调用成员结构

C++学习45 流成员函数put输出单个字符 cin输入流详解 get()函数读入一个字符

使用一个函数调用 C++ 初始化多个常量类成员

输入输出运算符必须是非成员函数

无法调用结构内部的成员函数指针