一个基于用户输入调用成员函数的 JButton
Posted
技术标签:
【中文标题】一个基于用户输入调用成员函数的 JButton【英文标题】:One JButton to call member functions based on user input 【发布时间】:2012-08-02 22:46:36 【问题描述】:给定一个 GUI 应用程序,用户将选择两个单选按钮之一,JRadioButton a
或 JRadioButton b
。根据他的选择,他将输入不同的输入。但是,要计算公式,他会单击常规按钮JButton c
。
但是,当在 ActionListener
中调用两个以上的成员函数时,就会出现问题。
对于ActionEvent
,我们有,
但是,程序只在调用堆栈中下降了一层,返回了catch
异常对话框。如何使当用户按下按钮c
时,根据选择a
或b
,他分别得到f
或b
?
【问题讨论】:
For within the ActionEvent, we have,
最好是发布SSCCE
上下文不足:必须针对给定的点击同时评估 blah
和 meh
吗? x
和 z
是否互斥?输入时可以输入verified 吗?
抛出了什么异常?
【参考方案1】:
您可以使用继承自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();
【讨论】:
但是 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的主要内容,如果未能解决你的问题,请参考以下文章