Java 一个基于用户输入调用成员函数的JButton
给定GUI应用程序,用户将从两个单选按钮中选择一个,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
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
);
}
}