2012-06-02 2 views
1

Я решил сделать аккуратную программу калькулятора, но теперь, когда я нажимаю вычислять и запускать скрипт вычисления, он не открывает поле, в котором указывается ответ. Я не могу понять проблему. Может кто-нибудь может рассказать мне?Java: диалоговое окно сообщения Joptionpane не открывается

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

public class Gui extends JFrame{ 

    private JTextField text; 
    private JTextField text2; 
    private JRadioButton plus; 
    private JRadioButton divide; 
    private JRadioButton multiply; 
    private JRadioButton subtract; 
    private ButtonGroup group; 
    private JButton button; 
    private int str = 1; 
    private String txt; 
    private String txt2; 
    private int num1; 
    private int num2; 
    private int ans; 

    public Gui(){ 

     super("Calculator"); 
     setLayout(new FlowLayout()); 

     text = new JTextField(10); 
     text2 = new JTextField(10); 
     add(text); 
     add(text2); 
     plus = new JRadioButton("Add", true); 
     divide = new JRadioButton("Divide", false); 
     multiply = new JRadioButton("Multiply", false); 
     subtract = new JRadioButton("Subtract", false); 
     group = new ButtonGroup(); 
     group.add(plus); 
     group.add(divide); 
     group.add(multiply); 
     group.add(subtract); 
     add(plus); 
     add(divide); 
     add(multiply); 
     add(divide); 
     add(subtract); 
     button = new JButton("Calculate"); 
     add(button); 

     plus.addItemListener(
       new ItemListener(){ 
        public void itemStateChanged(ItemEvent event){ 
         str = 1; 
         System.out.println(str); 
        } 
       } 
      ); 
     divide.addItemListener(
       new ItemListener(){ 
        public void itemStateChanged(ItemEvent event){ 
         str = 2; 
         System.out.println(str); 
        } 
       } 
      ); 
     multiply.addItemListener(
       new ItemListener(){ 
        public void itemStateChanged(ItemEvent event){ 
         str = 3; 
         System.out.println(str); 
        } 
       } 
      ); 
     subtract.addItemListener(
       new ItemListener(){ 
        public void itemStateChanged(ItemEvent event){ 
         str = 4; 
         System.out.println(str); 
        } 
       } 
      ); 
     HandlerClass handler = new HandlerClass(); 
     button.addActionListener(handler); 

    } 

    private class HandlerClass implements ActionListener{ 
     public void ActionPerformed(ActionEvent event){ 
       txt = text.getText(); 
       txt2 = text2.getText(); 
       num1 = Integer.parseInt(txt); 
       num2 = Integer.parseInt(txt2); 
       if(str==1){ 
        ans=num1+num2; 
       } 
       if(str==2){ 
        ans=num1/num2; 
       } 
       if(str==3){ 
        ans=num1*num2; 
       } 
       if(str==4){ 
        ans=num1-num2; 
       } 
       JOptionPane.showMessageDialog(null, String.format("Answer: %s", ans)); 

      } 
     } 
    } 

Вот сценарий, чтобы запустить его, если вы хотите:

import javax.swing.JFrame; 

public class apples { 
    public static void main(String[] args){ 
     Gui bucky = new Gui(); 
     bucky.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     bucky.setSize(300,150); 
     bucky.setVisible(true); 
    } 
} 

Вот код ошибки, когда я нажимаю "вычислить":

Исключение в потоке «АВТ-EventQueue-0 "java.lang.Error: Неразрешенная проблема компиляции: Тип Gui.HandlerClass должен реализовать унаследованный абстрактный метод ActionListener.actionPerformed (ActionEvent)

at Gui$HandlerClass.actionPerformed(Gui.java:85) 
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
at java.awt.Component.processMouseEvent(Unknown Source) 
at javax.swing.JComponent.processMouseEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Container.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Window.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$000(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 
+0

после некоторого тестирования, похоже, проблема с кнопкой сценария –

+0

См. Мой обновленный ответ. – wchargin

+0

Измените 'ActionPerformed' на' actionPerformed'. Вопросы правописания и капитализации. –

ответ

2

Проблема, скорее всего, у ваших слушателей. Все ваши переключатели используют ItemListener s, что хорошо, но ваш JButton тоже: стандартный прослушиватель для использования для JButton - это ActionListener. Если вы измените свой ItemListener на ActionListener (и событие ActionEvent), оно должно работать.

Причина, по которой объект не уволен, заключается в том, что JButton only fires the event if setSelected is called.

UPDATE: Ошибка в новом коде, который вы положили ActionPerformed вместо actionPerformed в качестве имени метода. Дело имеет значение.

UPDATE 2: Где вы объявляете все переменные, добавьте следующую переменную:

private ArrayList<JRadioButton> radioButtons = new ArrayList<JRadioButton>

Вы, возможно, потребуется импортировать java.util.ArrayList, если вы еще не сделали.

Тогда ниже линии

plus = new JRadioButton("Add", true); 
divide = new JRadioButton("Divide", false); 
multiply = new JRadioButton("Multiply", false); 
subtract = new JRadioButton("Subtract", false); 

добавить следующее:

radioButtons.add(plus); 
radioButtons.add(divide); 
radioButtons.add(multiply); 
radioButtons.add(subtract); 

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

for (JRadioButton button : radioButtons) { // Iterate over each button in the list 
    if (button.isSelected()) { // If the button is selected... 
     // do something 
    } 
} 

Ваш другой код выглядит fi ne, но я бы предложил использовать строковые константы (или, еще лучше, перечисления) для управления операциями + -/*. То есть, вместо того, чтобы str = "add" (и др.)., Вы должны объявить следующее перечисление:

private enum OperationType { 
    ADD, SUBTRACT, MULTIPLY, DIVIDE; 
} 

и изменить

private String str = "add" 

в

private OperationType op = OperationType.ADD; 

Результатом этого является то, что любые ошибки при вводе (включая tpyo или aCcidental capital) приведут к тому, что строка будет недействительной, и вы получите странное поведение.

Это также означает, что вы можете использовать switch заявление: вместо того, чтобы использовать много if .. else заявления, попробуйте следующее:

switch (op): 
    case ADD: 
     // blah 
     break; 
    case SUBTRACT: 
     // blah 
     break; 
    case MULTIPLY: 
     // blah 
     break; 
    case DIVIDE: 
     // blah 
     break; 
    default: 
     System.out.println("Error: unsupported operation"); 
     // or whatever 
} 

Это, как правило, считается чистым кодом, и он выглядит лучше и проще в обслуживании.

Удачи вам!

+0

я сосать в перечислении, я не понимаю, что я заменю публичный класс gui частным перечислением OperationType { ADD, SUBTRACT , MULTIPLY, DIVIDE; } или что? –

+0

Нет, не заменяйте его. Вы можете добавить еще один класс в один и тот же файл: так же, как у вас есть класс HandlerClass, добавьте перечисление 'OperationType'. – wchargin

2

Вы пытаетесь запустить несовместимый код - не делайте этого!

Вместо этого исправить все проблемы компиляции во время компиляции, а затем запустить только тогда, когда код хорошо компилируется.

Во-первых: Вам необходимо заглавные буквы .

следующее: у вас не должно быть любых слушателей на вашем JRadioButtons. Скорее проверьте, какая кнопка нажата только в ActionListener для основного вычисления JButton. Причина в том, что вам не важно, выбирает ли пользователь один JRadioButton, а затем последний меняет свое мнение и выбирает другого, но вам остается только , который JRadioButton был выбран при нажатии на JButton.

+0

Im a java noob Я не знаю как: P –

+0

@Aaron: вы не знаете, как это сделать? Компиляция? –

+0

Чтобы проверить, какая кнопка выбрана, проверьте значение, возвращаемое методом 'isSelected()' для всех из них. Вероятно, вы должны держать кнопки в массиве и перебирать их - я добавлю к моему ответу. – wchargin

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