我用Java swing库构建了一个计算器。除了actionEvent循环中的乘法和除法运算符之外,其他所有东西都可以工作。所有其他操作员都完全工作。
这是错误发生的: 我已经在代码的这一部分尝试了一个try语句
计算器:
计算器乘法错误:
首先输入数字
然后按下操作员,这是为了清除文本字段 - 此步骤发生错误
然后输入第二个数字
然后按=按钮输出答案
错误图片:
if(e.equals("*"))
{
fnum = txt.getText();
logic.setTotal(fnum);
op = "*";
txt.setText(""); // error occurs here, textfield isn't cleared
JOptionPane.showMessageDialog(null, fnum); //messagebox to see if fnum contains the string from the textfield
}
if(e.equals("/"))
{
fnum = txt.getText();
op = "/";
txt.setText("");
}
ActionEvent循环/功能:
public void actionPerformed(ActionEvent ea)
{
else if(op.equals("*"))
{
logic.setTotal(fnum);
logic.multiplication(snum);
total1 = logic.total;
}
else if(op.equals("/"))
{
logic.setTotal(fnum);
logic.divide(snum);
total1 = logic.total;
}
txt.setText(""+total1);
}
逻辑是内在的
内部阶级:
public class Inner extends Calculators{
public double total;
public Inner()
{
total = 0;
}
public void setTotal(String n)
{
total = convertToNumber(n);
}
public void divide(String n)
{
total /= convertToNumber(n);
}
public void multiplication(String n)
{
total *=convertToNumber(n);
}
}
如果您感到困惑,请索取更多代码,因为我无法包含所有代码。
答案 0 :(得分:3)
您最初是这样创建按钮的:
...
JButton plus = new JButton("+");
JButton multiplication = new JButton("*");
JButton divide = new JButton("/");
JButton minus = new JButton("-");
...
然后添加this
作为动作侦听器。但是有些线路丢失了:
...
plus.addActionListener(this);
// missing: multiplication.addActionListener(this);
// missing: divide.addActionListener(this);
minus.addActionListener(this);
...
我是如何找到错误的:
JOptionPane.showMessageDialog(null, fnum);
- 但是没有被调用。所以我坐在断点(在eclipse中)进行调试。actionPerformed
方法时,我搜索了注册ActionListeners的代码行。除此之外:我强烈建议重构您的代码。您可以从重新考虑代码结构中受益。您将获得更好的可读性,代码将更易于维护,并且可以更快地实现新功能。
我建议:
private
,以便您可以轻松找到对它们的所有引用。addActionListener
而是创建按钮集合(即ArrayList<JButton>
并使用for
循环为每个按钮调用addActionListener
。Calculators
,并将该代码直接放入Inner
的方法中。Inner
找到更有意义的名称。也许IntermediateResult
或类似。ActionListener
实例。这将花费一点性能(人类无法察觉),但会避免长if
- 链答案 1 :(得分:3)
只是一个侧面推荐,与您的主要问题无关,这就是为什么我将此作为社区Wiki发布而不是作为答案:避免不惜一切代价使用空布局。当然,null
布局和setBounds(...)
似乎可以像创建复杂GUI的最简单和最好的方式一样,更多的Swing GUI,你会创造更严重的困难。在使用它们时遇到。当GUI调整大小时,他们不会调整组件的大小,他们是增强或维护的皇室女巫,当他们放置在滚动窗格中时,他们完全失败,当他们在所有平台或屏幕分辨率不同时看起来很糟糕原来的。
例如,如果你使用智能的布局组合,你的GUI就可以自行组装,和更加灵活,如果您决定更改按钮的位置或添加新按钮。例如:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.*;
public class Calc2 extends JPanel {
private static final String[][] INITIAL_BTNS = {
{"1", "2", "3", "+"},
{"4", "5", "6", "-"},
{"7", "8", "9", "*"},
{"C", "0", ".", "/"},
{"1/x", "\u221A", "Ln", "="}
};
private static final String[][] EXTRA_BTNS = {
{"sin", "cos", "tan"},
{"csc", "sec", "cot"}
};
private static final int GAP = 5;
private JTextField displayField = new JTextField(10);
public Calc2() {
int rows = INITIAL_BTNS.length;
int cols = INITIAL_BTNS[0].length;
JPanel initialBtnPanel = new JPanel(new GridLayout(rows, cols, GAP, GAP));
rows = EXTRA_BTNS.length;
cols = EXTRA_BTNS[0].length;
JPanel extraBtnPanel = new JPanel(new GridLayout(rows, cols, GAP, GAP));
JPanel combinedBtnPanel = new JPanel();
combinedBtnPanel.setLayout(new BoxLayout(combinedBtnPanel, BoxLayout.PAGE_AXIS));
combinedBtnPanel.add(initialBtnPanel);
combinedBtnPanel.add(Box.createVerticalStrut(GAP));
combinedBtnPanel.add(extraBtnPanel);
for (int r = 0; r < INITIAL_BTNS.length; r++) {
for (int c = 0; c < INITIAL_BTNS[r].length; c++) {
JButton button = new JButton(INITIAL_BTNS[r][c]);
initialBtnPanel.add(button);
// add action here
}
}
for (int r = 0; r < EXTRA_BTNS.length; r++) {
for (int c = 0; c < EXTRA_BTNS[r].length; c++) {
JButton button = new JButton(EXTRA_BTNS[r][c]);
extraBtnPanel.add(button);
// add action here
}
}
setLayout(new BorderLayout(GAP, GAP));
setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
add(displayField, BorderLayout.PAGE_START);
add(combinedBtnPanel, BorderLayout.CENTER);
}
private static void createAndShowGui() {
JFrame frame = new JFrame("Calculator");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new Calc2());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
显示为:
如果以后您决定在额外按钮部分的顶部添加3个按钮,那么您需要对我的代码添加一行代码(不计算所需的逻辑代码更改)对你和我来说都是一样的),并改变这个:
private static final String[][] EXTRA_BTNS = {
{"sin", "cos", "tan"},
{"csc", "sec", "cot"}
};
到此:
private static final String[][] EXTRA_BTNS = {
{"foo", "bar", "baz"},
{"sin", "cos", "tan"},
{"csc", "sec", "cot"}
};
没有必要手动更改所有其他按钮的位置或手动重新调整JFrame的大小,因为布局管理器会为您处理此问题,GUI将显示为: