как вычислить результат двух целочисленных значений, но получить аддитивный или мультипликативный оператор из jComboBox в Java - PullRequest
1 голос
/ 21 июня 2011

предположим, у меня есть целочисленные переменные a, b и c.

c = a + b; or c = a - b; or c = a / b; or c = a * b;

Как вы можете видеть, оператор вычислений должен передаваться динамически во время выполнения. Итак, у меня есть оператор jComboBox, поэтому пользователь выберет +, -, * или / из jcomboBox.

как мне получить выбранный элемент jCombobox selected (который будет либо /, *, -, либо +) и использовать его для получения значения c.

Например. если пользователь выбирает *, то выражение должно быть c = a * b , в противном случае, если пользователь выбрал сказать +, тогда выражение должно быть c = a + b .

Ответы [ 4 ]

4 голосов
/ 21 июня 2011

Вот способ «обмануть».Все разборы выполняются ScriptEngine, нам просто нужно собрать части выражения.

ScriptEngine Calculator

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

class ScriptEngineCalculations {

    public static void main(String[] args) {
        final ScriptEngine engine = new ScriptEngineManager().
            getEngineByExtension( "js" );

        String[] ops = {"+", "-", "*", "/"};

        JPanel gui = new JPanel(new BorderLayout(2,2));
        JPanel labels = new JPanel(new GridLayout(0,1));
        gui.add(labels, BorderLayout.WEST);
        labels.add(new JLabel("a"));
        labels.add(new JLabel("operand"));
        labels.add(new JLabel("b"));
        labels.add(new JLabel("="));

        JPanel controls = new JPanel(new GridLayout(0,1));
        gui.add(controls, BorderLayout.CENTER);
        final JTextField a = new JTextField(10);
        controls.add(a);
        final JComboBox operand = new JComboBox(ops);
        controls.add(operand);
        final JTextField b = new JTextField(10);
        controls.add(b);
        final JTextField output = new JTextField(10);
        controls.add(output);

        ActionListener al = new ActionListener(){
            public void actionPerformed(ActionEvent ae) {
                String expression =
                    a.getText() +
                    operand.getSelectedItem() +
                    b.getText();
                try {
                    Object result = engine.eval(expression);
                    if (result==null) {
                        output.setText( "Output was 'null'" );
                    } else {
                        output.setText( result.toString() );
                    }
                } catch(ScriptException se) {
                    output.setText( se.getMessage() );
                }
            }
        };

        // do the calculation on event.
        operand.addActionListener(al);
        a.addActionListener(al);
        b.addActionListener(al);

        JOptionPane.showMessageDialog(null, gui);
    }
}

См. Также

2 голосов
/ 21 июня 2011
int c = compute(a,b, (String)comboBox.getSelectedItem()); 

...

private int compute(int a, int b, String operator) {
  int result = 0;
  if("*".equals(operator))
      result = a * b;
  else if("/".equals(operator))
      result = a / b;
  else if("+".equals(operator))
      result = a + b;
  else if("-".equals(operator))
      result = a - b;
  else 
      throw new IllegalArgumentException("operator type: " + operator + " ,not supported");

  return result;

}

2 голосов
/ 21 июня 2011

Вам нужно будет получить значение JComboBox и выполнить оператор switch на Char (потому что не может switch в строке), чтобы увидеть, какой он есть, затем выполнить правильную операцию.

Редактировать: Не могу switch на строку .... пока (Java 7)

1 голос
/ 21 июня 2011

Этот похожий вопрос может помочь.

Кроме того, вы можете связать каждый из операторов, показанных в выпадающем списке, с реализацией пользовательского интерфейса Calculator, который дает вам результат для любых двух чисел. Что-то вроде:

interface Calculator {
  public int calculate(int a, int b);
}
class AddCalculator implements Calculator {
  public int calculate(int a, int b) {return a+b;}
}

Ассоциация может иметь форму HashMap<String, Calculator>. Интерфейс Calculator может быть универсальным для типа, который вы передаете в качестве параметра и возвращаете как результат. Это был бы мой подход к проблеме, но я уверен, что мог бы быть более простой.

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