2013-03-22 2 views
0

У меня довольно простой калькулятор, и я пытаюсь связать ключи с JButtons. Я новичок в Java, и я мало знаю. Я знаю, что это связано с ActionListener, но я не могу окутать голову, как получить его в то, что у меня есть.Ключи привязки к JButtons

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

@SuppressWarnings("serial") 
public class Calculator2 extends JFrame implements ActionListener { 

    // Declare the GUI objects and variables HERE 
    JTextField ansText; 
    JButton b1, b2, b3, b4, b5, b6, b7, b8, b9, b0, plus, minus, multi, div, 
      equal, clear; 
    JPanel p1, p2, p3; 
    Double val1 = 0.0, val2 = 0.0, answer = 0.0; 
    int operator = 0; 

    public static void main(String[] args) { 
     new Calculator2(); 
    } 

    public Calculator2() { 

     // GUI Creation Code goes HERE 

     ansText = new JTextField("", 7); 
     ansText.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); 


     ansText.addKeyListener(new KeyAdapter() { //Allow only numbers in ansText 
      public void keyTyped(KeyEvent e) { 
       char c = e.getKeyChar(); 
       if (((c < '0') || (c > '9')) && (c != KeyEvent.VK_BACK_SPACE)) { 
        e.consume(); 
       } 
      } 
     }); 

     b1 = new JButton("1"); 
     b1.addActionListener(this); 
     b2 = new JButton("2"); 
     b2.addActionListener(this); 
     b3 = new JButton("3"); 
     b3.addActionListener(this); 
     b4 = new JButton("4"); 
     b4.addActionListener(this); 
     b5 = new JButton("5"); 
     b5.addActionListener(this); 
     b6 = new JButton("6"); 
     b6.addActionListener(this); 
     b7 = new JButton("7"); 
     b7.addActionListener(this); 
     b8 = new JButton("8"); 
     b8.addActionListener(this); 
     b9 = new JButton("9"); 
     b9.addActionListener(this); 
     b0 = new JButton("0"); 
     b0.addActionListener(this); 
     plus = new JButton("+"); 
     plus.addActionListener(this); 
     minus = new JButton("-"); 
     minus.addActionListener(this); 
     multi = new JButton("*"); 
     multi.addActionListener(this); 
     div = new JButton("/"); 
     div.addActionListener(this); 
     equal = new JButton("="); 
     equal.addActionListener(this); 
     clear = new JButton("C"); 
     clear.addActionListener(this); 

     this.setLayout(new BorderLayout()); 

     p1 = new JPanel(); 
     this.add(p1, BorderLayout.NORTH); 
     p1.setLayout(new GridLayout(0, 1, 2, 2)); 
     p1.add(ansText); 

     p2 = new JPanel(); 
     this.add(p2, BorderLayout.CENTER); 
     p2.setLayout(new GridLayout(4, 3, 2, 2)); 
     p2.add(b1); 
     p2.add(b2); 
     p2.add(b3); 
     p2.add(plus); 

     p2.add(b4); 
     p2.add(b5); 
     p2.add(b6); 
     p2.add(minus); 

     p2.add(b7); 
     p2.add(b8); 
     p2.add(b9); 
     p2.add(multi); 

     p2.add(clear); 
     p2.add(b0); 
     p2.add(equal); 
     p2.add(div); 

     this.setSize(200, 250); 
     this.setVisible(true); 
    } 

    public void actionPerformed(ActionEvent e) { 

     //Number input 
     if (e.getSource() == b1) { 
      ansText.setText(ansText.getText() + b1.getText()); 
     } 
     else if (e.getSource() == b2) { 
      ansText.setText(ansText.getText() + b2.getText()); 
     } 
     else if (e.getSource() == b3) { 
      ansText.setText(ansText.getText() + b3.getText()); 
     } 
     else if (e.getSource() == b4) { 
      ansText.setText(ansText.getText() + b4.getText()); 
     } 
     else if (e.getSource() == b5) { 
      ansText.setText(ansText.getText() + b5.getText()); 
     } 
     else if (e.getSource() == b6) { 
      ansText.setText(ansText.getText() + b6.getText()); 
     } 
     else if (e.getSource() == b7) { 
      ansText.setText(ansText.getText() + b7.getText()); 
     } 
     else if (e.getSource() == b8) { 
      ansText.setText(ansText.getText() + b8.getText()); 
     } 
     else if (e.getSource() == b9) { 
      ansText.setText(ansText.getText() + b9.getText()); 
     } 
     else if (e.getSource() == b0) { 
      ansText.setText(ansText.getText() + b0.getText()); 
     } 

     //Operator input 
     else if (e.getSource() == plus) { 
      operator = 1; 
      val1 = Double.parseDouble(ansText.getText()); 
      ansText.setText(""); 
     } 
     else if (e.getSource() == minus) { 
      operator = 2; 
      val1 = Double.parseDouble(ansText.getText()); 
      ansText.setText(""); 
     } 
     else if (e.getSource() == multi) { 
      operator = 3; 
      val1 = Double.parseDouble(ansText.getText()); 
      ansText.setText(""); 
     } 
     else if (e.getSource() == div) { 
      operator = 4; 
      val1 = Double.parseDouble(ansText.getText()); 
      ansText.setText(""); 
     } 
     //Misc 
     else if (e.getSource() == equal) { 
      val2 = Double.parseDouble(ansText.getText()); 
      if (operator == 1) { 
       answer = val1 + val2; 
       ansText.setText("" + answer); 
      } else if (operator == 2) { 
       answer = val1 - val2; 
       ansText.setText("" + answer); 
      } else if (operator == 3) { 
       answer = val1 * val2; 
       ansText.setText("" + answer); 
      } else if (operator == 4) { 
       answer = val1/val2; 
       ansText.setText("" + answer); 
      } 
     } 
     else if (e.getSource() == clear) { 
      ansText.setText(""); 
      val1 = 0.0; 
      val2 = 0.0; 
      answer = 0.0; 
      operator = 0; 
     } 
    } 
} 
+0

Какая ошибка вы видите? В чем проблема? – theJollySin

+0

, если вы пытаетесь связать клавиши с кнопками, то есть нажатие «+» на клавиатуре аналогично нажатию «+» в графическом интерфейсе, посмотрите http://docs.oracle.com/javase/tutorial/uiswing/misc/ keybinding.html – jedyobidan

ответ

0

Вы не хотите, чтобы один класс с несколькими внутренними классами выполнял всю вашу работу. Java Swing, как и большинство других GUI-систем, основан на MVC, Model-View-Controller.

Модель будет представлять собой объект, содержащий текущее значение аккумулятора и значение, хранящееся на дисплее. Если вы пишете калькулятор RPN, объект модели будет содержать стек RPN.

Вид будет классами Swing: JTextField и JButtons.

Контроллер будет каким-то новым объектом, скажем CalculatorController, что делает фактическую работу. Вместо вашего ActionListener добавления, вычитания, умножения или деления чисел они вызывают методы на вашем CalculatorController, и этот объект, в свою очередь, будет обновлять JTextField.

Предложение от jedyobidan посмотреть документацию Oracle очень хорошее. Вы хотите поместить штрихи клавиш во входную карту самого JPanel, так как они должны применяться независимо от того, где в панели, на которую пользователь сосредоточился. Затем карты действий будут содержать AbstractActions, которые вызовут методы на CalculatorController.

Я всегда думал, что стиль разработки графического интерфейса на Mac или его предшественнике NeXT с их программами Interface Builder намного лучше для новичков, чем стиль, используемый Java Swing.

2

How to Use Key Bindings В учебном пособии описаны детали привязок клавиш. Вот простой пример, как связать действие с плюсовой клавишей как на клавиатуре, так и на основной клавиатуре:

JPanel panel = new JPanel(); 
JPanel panel = new JPanel(); 
    panel.getInputMap(JPanel.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(
      KeyStroke.getKeyStroke(KeyEvent.VK_ADD, 0), "plus"); 
panel.getInputMap(JPanel.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(
     KeyStroke.getKeyStroke(KeyEvent.VK_EQUALS, 
       InputEvent.SHIFT_MASK), "plus"); 

panel.getActionMap().put("plus", plusAction); 
panel.add(button); 
+2

вы забыли упомянуть абстракцию фокуса Xxx.getInputMap (JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT/*. WHEN_FOCUSED * /) .put (KeyStroke.getKeyStroke («0»), «ноль»); – mKorbel

+0

@mKorbel пропустил это, спасибо! – tenorsax

Смежные вопросы