Проблема создания вычислений «движок» в двухклассном Java-калькуляторе - PullRequest
0 голосов
/ 18 марта 2010

Я столкнулся с кирпичной стеной, пытаясь создать двухклассный калькулятор Java. У меня есть код для интерфейса, который работает и отображается нормально, но создание отдельного класса CalcEngine для выполнения реальных расчетов оказалось мне не по карману.

Я был бы признателен, если бы кто-то мог запустить все для меня и создать класс calcEngine, который работает с классом интерфейса и позволяет вводить данные с помощью одной кнопки, то есть, если одна из них нажата на калькуляторе, на экране отображается 1.

Пожалуйста, обратите внимание, что я не прошу кого-то сделать все для меня, поскольку я хочу учиться, и я уверен, что смогу сделать все остальное, включая вычитание сложения и т. Д. Как только я преодолею препятствие, чтобы два класса общаться. Любая помощь будет принята с благодарностью.

Пожалуйста, смотрите код класса calcInterface ниже:

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

/**
*A Class that operates as the framework for a calculator. 
*No calculations are performed in this section
*/
public class CalcFrame
implements ActionListener
{
    private CalcEngine calc;

    private JFrame frame;
    private JTextField display;
    private JLabel status;

    /**
     * Constructor for objects of class GridLayoutExample
     */
    public CalcFrame()
    {
        makeFrame();
        //calc = engine;
    }

    /**
     * This allows you to quit the calculator.
     */
    // Alows the class to quit.
    private void quit()
    {
        System.exit(0);
    }

    // Calls the dialog frame with the information about the project.
    private void showAbout()
    {
        JOptionPane.showMessageDialog(frame, 
                    "Group Project",
                    "About Calculator Group Project", 
                    JOptionPane.INFORMATION_MESSAGE);
    }


    private void makeFrame()
    {
        frame = new JFrame("Group Project Calculator");
        makeMenuBar(frame);

        JPanel contentPane = (JPanel)frame.getContentPane();
        contentPane.setLayout(new BorderLayout(8, 8));
        contentPane.setBorder(new EmptyBorder( 10, 10, 10, 10));

        /**
     * Insert a text field
     */
        display = new JTextField();
        contentPane.add(display, BorderLayout.NORTH);

        //Container contentPane = frame.getContentPane();
        contentPane.setLayout(new GridLayout(4, 4));
        JPanel buttonPanel = new JPanel(new GridLayout(4, 4));
        contentPane.add(new JButton("1"));
        contentPane.add(new JButton("2"));
        contentPane.add(new JButton("3"));
        contentPane.add(new JButton("4"));
        contentPane.add(new JButton("5"));
        contentPane.add(new JButton("6"));
        contentPane.add(new JButton("7"));
        contentPane.add(new JButton("8"));
        contentPane.add(new JButton("9"));
        contentPane.add(new JButton("0"));
        contentPane.add(new JButton("+"));
        contentPane.add(new JButton("-"));
        contentPane.add(new JButton("/"));
        contentPane.add(new JButton("*"));
        contentPane.add(new JButton("="));
        contentPane.add(new JButton("C"));

        contentPane.add(buttonPanel, BorderLayout.CENTER);

        //status = new JLabel(calc.getAuthor());
        //contentPane.add(status, BorderLayout.SOUTH);

        frame.pack();
        frame.setVisible(true);
    }

    /**
     * Create the main frame's menu bar.
     * The frame that the menu bar should be added to.
     */
    private void makeMenuBar(JFrame frame)
    {
        final int SHORTCUT_MASK =
            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();

        JMenuBar menubar = new JMenuBar();
        frame.setJMenuBar(menubar);

        JMenu menu;
        JMenuItem item;

        // create the File menu
        menu = new JMenu("File");
        menubar.add(menu);

        // create the Quit menu with a shortcut "Q" key.
         item = new JMenuItem("Quit");
            item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, SHORTCUT_MASK));
            item.addActionListener(new ActionListener() {
                               public void actionPerformed(ActionEvent e) { quit(); }
                           });
        menu.add(item);

        // Adds an about menu.
        menu = new JMenu("About");
        menubar.add(menu);

        // Displays 
        item = new JMenuItem("Calculator Project");
            item.addActionListener(new ActionListener() {
                               public void actionPerformed(ActionEvent e) { showAbout(); }
                           });
        menu.add(item);
    }


 /**
     * An interface action has been performed.
     * Find out what it was and handle it.
     * @param event The event that has occured.
     */
    public void actionPerformed(ActionEvent event)
    {
        String command = event.getActionCommand();

        if(command.equals("0") ||
           command.equals("1") ||
           command.equals("2") ||
           command.equals("3") ||
           command.equals("4") ||
           command.equals("5") ||
           command.equals("6") ||
           command.equals("7") ||
           command.equals("8") ||
           command.equals("9")) {
            int number = Integer.parseInt(command);
            calc.numberPressed(number);
        }
        else if(command.equals("+")) {
            calc.plus();
        }
        else if(command.equals("-")) {
            calc.minus();
        }
        else if(command.equals("=")) {
            calc.equals();
        }
        else if(command.equals("C")) {
            calc.clear();
        }
        else if(command.equals("?")) {

        }
        // else unknown command.

        redisplay();
    }

    /**
     * Update the interface display to show the current value of the 
     * calculator.
     */
    private void redisplay()
    {
        display.setText("" + calc.getDisplayValue());
    }

    /**
     * Toggle the info display in the calculator's status area between the
     * author and version information.
     */
}

Ответы [ 2 ]

1 голос
/ 18 марта 2010

Вы можете создать класс CalcEngine и использовать calc = new CalcEngive() в конструкторе CalcFrame.

Класс двигателя может поддерживать 2 длинных атрибута: текущее значение и предыдущее значение, а также перечисляемое значение для запоминания выбранного оператора.

Метод numberPressed умножает текущее значение на 10 и добавляет число. Когда вы нажимаете оператор, копируете текущее значение в предыдущее значение (принимая во внимание любой запомненный опаратор, присутствующий в атрибуте перечислителя.) Оператор присваивания копирует результат операции обратно в текущее значение, а оператор «C» очищает оба текущее и предыдущее значение.

Как видите, вы можете реализовать все функциональные возможности, присутствующие в методе фрейма пользовательского интерфейса, методом.

Надеюсь, это поможет вам начать. Как только вы это сделаете, я уверен, что все встанет на свои места.

Обновление:

После того, как вы какое-то время пялились на пустой класс CalcEngine (вы получили источник CalcFrame как часть задания?), Следующие шаги:

  • добавить атрибуты, упомянутые выше
  • посмотрите на ваш CalcFrame источник и определите обращения к движку; calc.xxxxx()
  • добавьте методы, которые вы нашли в предыдущем шаге, и проверьте зависимости, скомпилировав
  • реализовать методы
1 голос
/ 18 марта 2010

Хитрость в том, что калькулятор должен иметь «состояние». Проще визуализировать операции, которые требуют двух операндов, и те, которые требуют одного операнда (например, квадратный корень). Так что добавьте хороший держатель состояния (переменную экземпляра), который содержит предыдущую запись, которая доступна для фактического механизма вычислений. Надеюсь, это то, о чем вы просили.

Объяснение добавлено

На каждом из кнопок Jbutton добавьте слушателя кнопки. Имейте переменную экземпляра, такую ​​как double firstOp и другую переменную экземпляра String operationType. По событию нажатия цифровых кнопок добавляйте значения в текстовую область. При щелчке операнда анализируйте строку, содержащуюся в textArea, в firstOp. У двойного класса есть методы, чтобы сделать это. Сохраните значение операнда в поле operationType (PLUS, MINUS и т. Д.). если это оператор с одним операндом. Вызвать метод Calc Engine и вернуть значение (установить значение в текстовом поле). В противном случае очистите текстовое поле и продолжайте добавлять значения до тех пор, пока не сработает '=', и в этом случае с помощью firstOp, operationType и текущего значения в текстовом поле определяют метод, который будет вызываться в Calc Engine. Наконец верните значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...