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

Java 一个基于用户输入调用成员函数的JButton,java,swing,jbutton,jradiobutton,Java,Swing,Jbutton,Jradiobutton,给定GUI应用程序,用户将从两个单选按钮中选择一个,JRadioButton a或JRadioButton b。根据他的选择,他将输入不同的输入。但是,要计算公式,他将单击一个常规按钮,jbuttonc 但是,如果在ActionListener中调用了两个以上的成员函数,就会出现问题 c = new JButton( "c" ); c.addActionListener( new ActionListener() { @Override public

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

但是,如果在
ActionListener
中调用了两个以上的成员函数,就会出现问题

c = new JButton( "c" ); c.addActionListener( new ActionListener() { @Override public void actionPerformed( ActionEvent e ) { cActionPerformed( e ); } });
但是,程序在调用堆栈中只向下一级,返回
catch
exception对话框。如何使其在用户按下按钮
c
时,根据选择的是
a
还是
b
,分别获得
f
b

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

例如:

  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();
    }

您可以使用单选按钮的
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
块时出现的问题与确定选择了哪个单选按钮无关。它进入catch块的唯一方法是抛出
NumberFormatException
。抛出
NumberFormatException
的唯一方法是它是否来自
foo.blah(x,y)或<代码>条形meh(y,z)

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


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

因为在ActionEvent中,我们有,
最好是发布一个不够的上下文:必须为给定的单击计算
blah
meh
x
z
是否相互排斥?输入是否可以在条目上?引发了什么异常?但是getSource()将返回单击的按钮。不是选中的单选按钮。它抛出了我在
catch
块中声明的异常。您确定这与此相关吗?从何处抛出此异常?富和酒吧?原因是什么?
java.lang.NumberFormatException:sun处的空字符串。misc.FloatingDecimal.readJavaFormatString(未知源)处的java.lang.Double.parseDouble(未知源)处的foobar.cActionPerformed(foobarFrame.java:86)处的foobar$3.actionPerformed(foobarFrame.java:54)所以“LoanCalculatorFrame”类的第86行抛出异常。哪种方法在那条线上?我们能看到该方法的源代码吗?我猜你在用这个方法把一个字符串转换成一个数字。java文档对此异常的描述是这样的:“抛出以指示应用程序已尝试将字符串转换为一种数值类型,但该字符串没有适当的格式。”
double amt=double.parseDouble(loanTextField.getText())
所以问题是
loanTextField
中的文本无法解析为double,因为它的格式不正确。如果您将文本打印到控制台窗口,您可能会看到问题(使用
System.out.println(“““+loanTextField.getText()+””);
-这样您就可以看到结尾处有多余的空格)对不起-我一定是误解了我的意图。我愿意牵着你的手帮助你解决问题,因为这是一次很好的学习经历(对你来说)。我想我们已经找到了问题所在-您试图将文本框中的空格、%或某些非数字字符转换为数字。我很确定你能从这里找到答案。。。(这将不是这些字符中的一个:
0123456789-。
)我现在要睡觉了-祝你好运找到罪犯!
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
        );
    }
}