Извличане на двойно от JTextArea при решаване на X

Добре, аз съм нов в java. Създавам програма, която решава уравнения с една стъпка. Все пак имам известни трудности при стартирането му. Ето кода за моя основен файл, Main.java:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Main extends JFrame implements ActionListener {
    private static final long serialVersionUID = 1L;
    Solve solve = new Solve();
    JButton add = new JButton("Add");
    JButton sub = new JButton("Subtract");
    JButton mult = new JButton("Multiply");
    JButton div = new JButton("Divide");
    JButton solv = new JButton("Solve!");
    JTextArea one = new JTextArea();
    JLabel two = new JLabel(" = ");
    JLabel three = new JLabel("X");
    JLabel four = new JLabel();
    JTextArea five = new JTextArea();
    JLabel solved = new JLabel();
    JPanel row1 = new JPanel();
    JPanel row2 = new JPanel();
    JPanel row3 = new JPanel();

    public double funct;

    public Main() {
        super("Solving a one step equation!");
        setSize(500, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        GridLayout layout = new GridLayout();
        setLayout(layout);

        FlowLayout layout1 = new FlowLayout(FlowLayout.CENTER);

        row1.setLayout(layout1);
        row1.add(add);
        row1.add(sub);
        row1.add(mult);
        row1.add(div);
        row1.add(solv);
        add(row1);
        add.addActionListener(this);
        sub.addActionListener(this);
        mult.addActionListener(this);
        div.addActionListener(this);
        solv.addActionListener(this);

        GridLayout layout2 = new GridLayout(1, 1, 1, 1);
        row2.setLayout(layout2);
        row2.add(one, BorderLayout.CENTER);
        row2.add(two, BorderLayout.CENTER);
        row2.add(three, BorderLayout.CENTER);
        row2.add(four, BorderLayout.CENTER);
        row2.add(five);
        add(row2, BorderLayout.CENTER);

        GridLayout layout3 = new GridLayout(5, 5, 5, 5);
        row3.setLayout(layout3);
        row3.add(solved);
        add(row3);
    }

    public static void main(String[] args) {
        Main frame = new Main();
    }

    public void actionPerformed(ActionEvent evt) {
        Object source = evt.getSource();
        if(source == add)
        {
            four.setText(" + ");
            funct = 1;
        }
        else if(source == sub)
        {
            four.setText(" - ");
            funct = 2;
        }
        else if(source == mult)
        {
            four.setText(" * ");
            funct = 3;
        }
        else if(source == div)
        {
            four.setText(" / ");
            funct = 4;
        }
        if(source == solv)
        {
            if(funct == 1)
            {

                double Ones = Double.parseDouble(three.getText());
                double Twos = Double.parseDouble(three.getText());
                solved.setText("X = " + solve.Add(Ones, Twos));
            }
            else if(funct == 2)
            {
                double Ones = Double.parseDouble(three.getText());
                double Twos = Double.parseDouble(three.getText());
                solved.setText("X = " + solve.Sub(Ones, Twos));
            }
            else if(funct == 3)
            {
                double Ones = Double.parseDouble(three.getText());
                double Twos = Double.parseDouble(three.getText());
                solved.setText("X = " + solve.Mult(Ones, Twos));
            }
            else if(funct == 4)
            {
                double Ones = Double.parseDouble(three.getText());
                double Twos = Double.parseDouble(three.getText());
                solved.setText("X = " + solve.Div(Ones, Twos));
            }

        }
    }

}

Ето кода за другия ми файл, Solve.java

public class Solve {
    public double Add(double One, double Two)
    {
        return One - Two;
    }

    public double Sub(double One, double Two)
    {
        return One + Two;
    }

    public double Mult(double One, double Two)
    {
        return One / Two;
    }

    public double Div(double One, double Two)
    {
        return One * Two;
    }
}

Някаква помощ ще бъде оценена. Някой вижда ли какво правя погрешно?


person The_Steve13    schedule 16.06.2012    source източник
comment
Може да обмислите да ни кажете повече подробности за вашия проблем.   -  person Hovercraft Full Of Eels    schedule 16.06.2012
comment
Мда. Това, което правите погрешно е: 1. Публикувате твърде много код. Никой няма време да анализира целия ви код и да търси грешки. 2. Не задава правилни въпроси. 3. Не ни казва какъв е действителният проблем.   -  person npe    schedule 16.06.2012


Отговори (2)


Получавате NumberFormatException след щракване върху бутона „Решаване“. Изглежда като проблем с копиране/поставяне - не извличате правилните числа. Опитвате се да преобразувате низ „X“ в двоен. Най-добре е да дадете смислени имена на вашите променливи. За да коригирате изключението, опитайте това, заменете:

double Ones = Double.parseDouble(three.getText());
double Twos = Double.parseDouble(three.getText());

с:

double Ones = Double.parseDouble(one.getText());
double Twos = Double.parseDouble(five.getText());

Запознайте се с Конвенции за кода, Конвенции за именуване раздел по-специално.

person tenorsax    schedule 16.06.2012
comment
Благодаря момчета. Работи. И причината да публикувам целия код беше, че нямах представа къде съм сбъркал. - person The_Steve13; 17.06.2012

В допълнение към полезния отговор на @Max, ето няколко други предложения:

  • Задаването на оформлението на рамката на new GridLayout() по подразбиране е един ред и колона без подложки. Като алтернатива, разгледайте new GridLayout(0, 1, 5, 5), което произвежда произволен брой редове в една колона с 5x5 подложка. След това можете да се съсредоточите върху оформлението на всеки ред:

    row1.setLayout(new FlowLayout(FlowLayout.CENTER));
    row2.setLayout(new FlowLayout(FlowLayout.CENTER));
    row3.setLayout(new GridLayout(1, 1, 5, 5));
    
  • Преместете вашето setVisible() извикване в края на конструктора на рамката:

    pack();
    setLocationRelativeTo(null);
    setVisible(true);
    
  • Помислете за getRootPane().setDefaultButton(solv), за да направите бутона Решаване по подразбиране.

  • Помислете дали да направите добавянето по подразбиране:

    private JLabel four = new JLabel("+");
    private int funct = 1; // add by default
    
  • Обмислете използването на JTextField за въвеждане на номера:

    private JTextField one = new JTextField(10);
    private JTextField five = new JTextField(10);
    
person trashgod    schedule 16.06.2012
comment
+1 за първи път да знам, че FlowLayout има FlowLayout.CENTER. - person Eng.Fouad; 17.06.2012
comment
@Eng.Fouad: Добра гледна точка; това е align по подразбиране за FlowLayout . Както знаете, FlowLayout е оформлението по подразбиране за JPanel, но понякога е полезно да го направите изрично. - person trashgod; 17.06.2012