gpt4 book ai didi

java - Action 监听器错误

转载 作者:行者123 更新时间:2023-12-01 13:24:17 27 4
gpt4 key购买 nike

所以我制作了这个Java GUI,它基本上解决了SUVAT问题(对于那些不熟悉SUVAT的人来说,它基本上告诉你汽车在给定速度/时间的情况下将加速多少,或者找到多高的加速度)球将以给定的速度等移动。您使用它的力学)。我知道我的程序存在缺陷,例如仅生成整数变量(只是为了保持整洁),因此答案可能会被四舍五入。布局不好,但我最近才开始编程。GUI 加载完美,但是当用户按下计算按钮时,它就会崩溃。我怀疑它与按钮上的 Action 监听器有关,因为我认为我让它变得有点复杂。

用户基本上选择他想要解决的问题(例如,如果我想找到汽车的加速度,那么我会检查加速度单选按钮,并输入我知道的给定变量(即初始速度为 15,最终速度为速度为 30,时间为 2,因此加速度应为 7.5(本例中为 8,因为使用了整数)。程序会选择最合适的方程来查找您想知道的变量。

这是代码:

   import javax.swing.JFrame;


public class GUImain {

public static void main(String[] args) {

GUI go = new GUI();
go.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
go.setSize(400,400);
go.setVisible(true);

}

}

import java.awt.FlowLayout;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JRadioButton;
import javax.swing.JTextField;

public class GUI extends JFrame implements ActionListener {

JTextField DISPLACEMENT = new JTextField("Displacement", 20);
JTextField INITALVELOCITY = new JTextField("Intital Velocity", 20);
JTextField FINALVELOCITY = new JTextField("Final Velocity", 20);
JTextField ACCELERATION = new JTextField("Acceleration", 20);
JTextField TIME = new JTextField("Time");

JRadioButton S = new JRadioButton("Displacement", true);
JRadioButton U = new JRadioButton("Inital Velocity", false);
JRadioButton V = new JRadioButton("Final Velocity", false);
JRadioButton A = new JRadioButton("Acceleration", false);
JRadioButton T = new JRadioButton("Time", false);
ButtonGroup VARIABLEFINDER;
JButton CALCULATE = new JButton("Calculate");

GUI() {
super("SUVAT Solver");
setLayout(new FlowLayout());
add(DISPLACEMENT);
add(INITALVELOCITY);
add(FINALVELOCITY);
add(ACCELERATION);
add(TIME);
add(CALCULATE);

add(S);
add(U);
add(V);
add(A);
add(T);

VARIABLEFINDER = new ButtonGroup();
VARIABLEFINDER.add(S);
VARIABLEFINDER.add(U);
VARIABLEFINDER.add(V);
VARIABLEFINDER.add(A);
VARIABLEFINDER.add(T);

// Adding Listeners to the RadioButtons
CALCULATE.addActionListener(this);

}

@Override
public void actionPerformed(ActionEvent e) {

String dis = DISPLACEMENT.getText();
int SS = Integer.parseInt(dis);

String initv = INITALVELOCITY.getText();
int UU = Integer.parseInt(initv);

String finalv = FINALVELOCITY.getText();
int VV = Integer.parseInt(finalv);

String acc = ACCELERATION.getText();
int AA = Integer.parseInt(acc);

String timme = TIME.getText();
int TT = Integer.parseInt(timme);

// CALCULATING DISPLACEMENT
if (e.getSource() == CALCULATE && S.isSelected()) {
if (FINALVELOCITY.getText().equals("Final Velocity")) {
SS = (int) ((int) (UU * TT) + (0.5 * AA * (TT * TT)));
JOptionPane.showMessageDialog(null,
"The displacement claulcated is " + SS);
} else if (ACCELERATION.getText().equals("Acceleration")) {
SS = (int) 0.5 * (UU + VV) * TT;
JOptionPane.showMessageDialog(null,
"The displacement claulcated is " + SS);
} else if (INITALVELOCITY.getText().equals("Inital Velocity")) {
SS = (int) ((VV * TT) - (0.5 * AA * (TT * TT)));
JOptionPane.showMessageDialog(null,
"The displacement claulcated is " + SS);
} else if (TIME.getText().equals("Time")) {
SS = (((VV * VV) - (UU * UU)) / (2 * AA));
JOptionPane.showMessageDialog(null,
"The displacement claulcated is " + SS);
}

}
// CALCULATING THE INITAL VELOCITY
if (e.getSource() == CALCULATE && U.isSelected()) {
if (FINALVELOCITY.getText().equals("Final Velocity")) {
UU = (int) ((SS - (0.5 * AA * (TT * TT))) / (TT));
JOptionPane.showMessageDialog(null,
"The intial velocity claulcated is " + UU);
} else if (ACCELERATION.getText().equals("Acceleration")) {
UU = ((2 * SS) / TT) - VV;
JOptionPane.showMessageDialog(null,
"The intial velocity claulcated is " + UU);
} else if (TIME.getText().equals("Time")) {
UU = (int) Math.sqrt(((VV * VV) - (2 * AA * SS)));
JOptionPane.showMessageDialog(null,
"The intial velocity claulcated is " + UU);
} else if (DISPLACEMENT.getText().equals("Displacement")) {
UU = (AA * TT) - VV;
JOptionPane.showMessageDialog(null,
"The intial velocity claulcated is " + UU);
}
}

// CALCULATING THE FINAL VELOCITY
if (e.getSource() == CALCULATE && V.isSelected()) {
if (INITALVELOCITY.getText().equals("Inital Velocity")) {
VV = (int) ((SS + (0.5 * AA * (TT * TT))) / TT);
JOptionPane.showMessageDialog(null,
"The final velocity claulcated is " + VV);
} else if (TIME.getText().equals("Time")) {
VV = (int) Math.sqrt(((UU * UU) + (2 * AA * SS)));
JOptionPane.showMessageDialog(null,
"The final velocity claulcated is " + VV);
} else if (DISPLACEMENT.getText().equals("Displacement")) {
VV = (AA * TT) + UU;
JOptionPane.showMessageDialog(null,
"The final velocity claulcated is " + VV);
} else if (ACCELERATION.getText().equals("Acceleration")) {
VV = ((2 * SS) / TT) - UU;
JOptionPane.showMessageDialog(null,
"The final velocity claulcated is " + VV);
}
}

// CALCULATING THE ACCELERATION
if (e.getSource() == CALCULATE && A.isSelected()) {
if (INITALVELOCITY.getText().equals("Inital Velocity")) {
AA = (int) ((SS - (VV * TT)) / (-0.5 * (TT * TT)));
JOptionPane.showMessageDialog(null,
"The acceleration claulcated is " + AA);
} else if (TIME.getText().equals("Time")) {
AA = (((VV * VV) - (UU * UU)) / (2 * SS));
JOptionPane.showMessageDialog(null,
"The acceleration claulcated is " + AA);
} else if (DISPLACEMENT.getText().equals("Displacement")) {
AA = (VV - UU) / TT;
JOptionPane.showMessageDialog(null,
"The acceleration claulcated is " + AA);
} else if (FINALVELOCITY.getText().equals("Final Velocity")) {
VV = (int) ((SS - (UU * TT)) / (0.5 * (TT * TT)));
JOptionPane.showMessageDialog(null,
"The acceleration claulcated is " + AA);
}
}

// CALCULATING THE TIME
if (CALCULATE.getAction() && A.isSelected()) {
if (INITALVELOCITY.getText().equals("Inital Velocity")) {
AA = (int) ((SS - (VV * TT)) / (-0.5 * (TT * TT)));
JOptionPane.showMessageDialog(null,
"havent done the time calculations yet");
} else if (TIME.getText().equals("Time")) {
AA = (((VV * VV) - (UU * UU)) / (2 * SS));
JOptionPane.showMessageDialog(null,
"havent done the time calculations yet");
} else if (DISPLACEMENT.getText().equals("Displacement")) {
AA = (VV - UU) / TT;
JOptionPane.showMessageDialog(null,
"havent done the time calculations yet");
} else if (FINALVELOCITY.getText().equals("Final Velocity")) {
VV = (int) ((SS - (UU * TT)) / (0.5 * (TT * TT)));
JOptionPane.showMessageDialog(null,
"havent done the time calculations yet");
}
}

}

}

我认为当有人想要使用不包含位移的方程((V-U)/T)找到加速度时,编译器仍然将文本字段中的默认文本识别为字符串并且将字符串转换为 int,因为当单击计算按钮时,文本字段中的所有内容都会转换为 int,并且操作监听器中的参数非常具体。

这是错误:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "Displacement"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at GUI.actionPerformed(GUI.java:66)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

编辑 = 谢谢蜘蛛鲍里斯,你让我意识到我正在尝试将字符串转换为 int,其中该字符串不包含任何数字。愚蠢的我。那真是太尴尬了。这就是问题所在

无论如何,程序运行良好,给出了预期的四舍五入的答案。但我很确定我将应用程序的代码拖得有点太多了。这是工作代码的工作部分操作部分监听器:

public void actionPerformed(ActionEvent e) {



// CALCULATING DISPLACEMENT
if (e.getSource() == CALCULATE && S.isSelected()) {
if (FINALVELOCITY.getText().equals("")) {
String initv = INITALVELOCITY.getText();
int UU = Integer.parseInt(initv);
String timme = TIME.getText();
int TT = Integer.parseInt(timme);
String acc = ACCELERATION.getText();
int AA = Integer.parseInt(acc);

int SS = (int) ((int) (UU * TT) + (0.5 * AA * (TT * TT)));

JOptionPane.showMessageDialog(null,
"The displacement claulcated is " + SS);
} else if (ACCELERATION.getText().equals("")) {
String timme = TIME.getText();
int TT = Integer.parseInt(timme);
String finalv = FINALVELOCITY.getText();
int VV = Integer.parseInt(finalv);
String initv = INITALVELOCITY.getText();
int UU = Integer.parseInt(initv);

int SS = (int) 0.5 * (UU + VV) * TT;

JOptionPane.showMessageDialog(null,
"The displacement claulcated is " + SS);
} else if (INITALVELOCITY.getText().equals("")) {
String timme = TIME.getText();
int TT = Integer.parseInt(timme);
String acc = ACCELERATION.getText();
int AA = Integer.parseInt(acc);
String finalv = FINALVELOCITY.getText();
int VV = Integer.parseInt(finalv);

int SS = (int) ((VV * TT) - (0.5 * AA * (TT * TT)));

JOptionPane.showMessageDialog(null,
"The displacement claulcated is " + SS);

} else if (TIME.getText().equals("")) {

String finalv = FINALVELOCITY.getText();
int VV = Integer.parseInt(finalv);
String initv = INITALVELOCITY.getText();
int UU = Integer.parseInt(initv);
String acc = ACCELERATION.getText();
int AA = Integer.parseInt(acc);

int SS = (((VV * VV) - (UU * UU)) / (2 * AA));

JOptionPane.showMessageDialog(null,
"The displacement claulcated is " + SS);
}

}
// CALCULATING THE INITAL VELOCITY
if (e.getSource() == CALCULATE && U.isSelected()) {
if (FINALVELOCITY.getText().equals("")) {

String dis = DISPLACEMENT.getText();
int SS = Integer.parseInt(dis);
String acc = ACCELERATION.getText();
int AA = Integer.parseInt(acc);
String timme = TIME.getText();
int TT = Integer.parseInt(timme);


int UU = (int) ((SS - (0.5 * AA * (TT * TT))) / (TT));
JOptionPane.showMessageDialog(null,
"The intial velocity claulcated is " + UU);


} else if (ACCELERATION.getText().equals("")) {
String timme = TIME.getText();
int TT = Integer.parseInt(timme);
String dis = DISPLACEMENT.getText();
int SS = Integer.parseInt(dis);
String finalv = FINALVELOCITY.getText();
int VV = Integer.parseInt(finalv);


int UU = ((2 * SS) / TT) - VV;
JOptionPane.showMessageDialog(null,
"The intial velocity claulcated is " + UU);
}


else if (TIME.getText().equals("")) {

String finalv = FINALVELOCITY.getText();
int VV = Integer.parseInt(finalv);
String acc = ACCELERATION.getText();
int AA = Integer.parseInt(acc);
String dis = DISPLACEMENT.getText();
int SS = Integer.parseInt(dis);

int UU = (int) Math.sqrt(((VV * VV) - (2 * AA * SS)));
JOptionPane.showMessageDialog(null,
"The intial velocity claulcated is " + UU);
} else if (DISPLACEMENT.getText().equals("")) {
String acc = ACCELERATION.getText();
int AA = Integer.parseInt(acc);
String finalv = FINALVELOCITY.getText();
int VV = Integer.parseInt(finalv);
String timme = TIME.getText();
int TT = Integer.parseInt(timme);

int UU = (AA * TT) - VV;
JOptionPane.showMessageDialog(null,
"The intial velocity claulcated is " + UU);
}
}

// CALCULATING THE FINAL VELOCITY
if (e.getSource() == CALCULATE && V.isSelected()) {



if (INITALVELOCITY.getText().equals("")) {
String dis = DISPLACEMENT.getText();
int SS = Integer.parseInt(dis);
String acc = ACCELERATION.getText();
int AA = Integer.parseInt(acc);
String timme = TIME.getText();
int TT = Integer.parseInt(timme);


int VV = (int) ((SS + (0.5 * AA * (TT * TT))) / TT);
JOptionPane.showMessageDialog(null,
"The final velocity claulcated is " + VV);
} else if (TIME.getText().equals("")) {
String acc = ACCELERATION.getText();
int AA = Integer.parseInt(acc);String dis = DISPLACEMENT.getText();
int SS = Integer.parseInt(dis);
String initv = INITALVELOCITY.getText();
int UU = Integer.parseInt(initv);

int VV = (int) Math.sqrt(((UU * UU) + (2 * AA * SS)));
JOptionPane.showMessageDialog(null,
"The final velocity claulcated is " + VV);
} else if (DISPLACEMENT.getText().equals("")) {
String initv = INITALVELOCITY.getText();
int UU = Integer.parseInt(initv);
String timme = TIME.getText();
int TT = Integer.parseInt(timme);
String acc = ACCELERATION.getText();
int AA = Integer.parseInt(acc);

int VV = (AA * TT) + UU;
JOptionPane.showMessageDialog(null,
"The final velocity claulcated is " + VV);
} else if (ACCELERATION.getText().equals("")) {
String timme = TIME.getText();
int TT = Integer.parseInt(timme);
String dis = DISPLACEMENT.getText();
int SS = Integer.parseInt(dis);
String initv = INITALVELOCITY.getText();
int UU = Integer.parseInt(initv);

int VV = ((2 * SS) / TT) - UU;
JOptionPane.showMessageDialog(null,
"The final velocity claulcated is " + VV);
}
}

// CALCULATING THE ACCELERATION
if (e.getSource() == CALCULATE && A.isSelected()) {
if (INITALVELOCITY.getText().equals("")) {
String dis = DISPLACEMENT.getText();
int SS = Integer.parseInt(dis);
String finalv = FINALVELOCITY.getText();
int VV = Integer.parseInt(finalv);
String timme = TIME.getText();
int TT = Integer.parseInt(timme);

int AA = (int) ((SS - (VV * TT)) / (-0.5 * (TT * TT)));
JOptionPane.showMessageDialog(null,
"The acceleration claulcated is " + AA);
} else if (TIME.getText().equals("")) {
String dis = DISPLACEMENT.getText();
int SS = Integer.parseInt(dis);
String initv = INITALVELOCITY.getText();
int UU = Integer.parseInt(initv);
String finalv = FINALVELOCITY.getText();
int VV = Integer.parseInt(finalv);

int AA = (((VV * VV) - (UU * UU)) / (2 * SS));
JOptionPane.showMessageDialog(null,
"The acceleration claulcated is " + AA);
} else if (DISPLACEMENT.getText().equals("")) {

String finalv = FINALVELOCITY.getText();
int VV = Integer.parseInt(finalv);
String initv = INITALVELOCITY.getText();
int UU = Integer.parseInt(initv);
String timme = TIME.getText();
int TT = Integer.parseInt(timme);

int AA = (VV - UU) / TT;
JOptionPane.showMessageDialog(null,
"The acceleration claulcated is " + AA);
} else if (FINALVELOCITY.getText().equals("")) {
String initv = INITALVELOCITY.getText();
int UU = Integer.parseInt(initv);
String dis = DISPLACEMENT.getText();
int SS = Integer.parseInt(dis);
String timme = TIME.getText();
int TT = Integer.parseInt(timme);
int AA = (int) ((SS - (UU * TT)) / (0.5 * (TT * TT)));
JOptionPane.showMessageDialog(null,
"The acceleration claulcated is " + AA);
}
}

我很确定我可以创建将字符串转换为整数作为不同类的对象的方法,因此当我想将字符串从位移文本字段转换为 int 时,我可以调用该对象吗?

最佳答案

主要问题已由蜘蛛鲍里斯在一条评论中解决。

关于编辑部分中隐含的问题:

Im pretty sure I could've made the methods thats converts the string into integers as an object of a different class so when I want to convert a string from the displacement textfield to an int, i could just call that object?

确实,当前形式的代码并不优雅。主要是因为它的重复性很高。有几种方法可以改善这一点。一个步骤可能是这样的方法

private static int parseIntFrom(JTextField textField, String name)
{
String string = textField.getText().trim();
try
{
return Integer.parseInt(string);
}
catch (NumberFormatException e)
{
JOptionPane.showMessageDialog(null,
"The "+name+" is not a valid integer: "+string);
}
return 0;
}

此方法可以替换高度重复的解析代码,顺便说一下,通过在输入无效时显示一条消息来引入“错误处理”的第一步:

// Remove this:
// String timme = TIME.getText();
// int TT = Integer.parseInt(timme);

// Becomes
int TT = parseIntFrom(TIME, "time");

或者,蜘蛛鲍里斯提到的JFormattedTextField可用于确保首先只能输入有效的整数值。

我认为复杂的 if/else 结构可以进一步简化,但必须知道预期的工作流程(以及可能使用的公式)才能提供更详细的提示。到目前为止,唯一的建议是至少引入一些具有“会说话”名称的方法,例如

private void calculateDisplacement() { ... }    
private void calculateAcceleration() { ... }
...

actionPerformed 方法调用。

关于java - Action 监听器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21857903/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com