2016-06-01 10 views
0

Целью является создание программы, которая использует графический интерфейс для вычисления факториала. Мне нужно создать jPanel или jFrame для отображения результатов программы. Затем мне нужно получить текст из JTextField и разобрать его на Integer, чтобы он мог быть передан конструктору. В-третьих, класс объекта должен быть создан с переменной экземпляра типа int, называемой факториалом. Для этого класса объектов требуется один конструктор аргументов с именем Factorial, который принимает int и присваивает значение переменной экземпляра. Затем он должен иметь метод, который вычисляет факториал, используя цикл for с типом возвращаемого значения int. Наконец, он должен отображать значение объекта после вызова метода, который вычисляет факториал. Вот моя работа.Java Factorial GUI

import javax.swing.JFrame; 

public class factorialCalc 

{ 

    public static void main (String[] args) 

    { 

      JFrame frame=new JFrame ("Factorial Calculator"); 

      frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 

      Factorial panel=new Factorial(); 

      frame.getContentPane().add(panel); 

      frame.pack(); 

      frame.setVisible(true); 

    } 

} 

И мой следующий файл является класс Object:

import java.awt.*; 

import java.awt.event.*; 

import javax.swing.*; 



public class Factorial extends JPanel 

{ 

      private int factorial; 

      private JLabel inputLabel,resultLabel; 

      private JTextField factorialText; 

      private JButton factButton; 



      //Constructor: sets up main GUI components 

      public void FactorialPanel(int factorial) 

      { 

       this.factorial=factorial; 

       inputLabel= new JLabel ("Please enter an integer:"); 

       factButton = new JButton("Compute"); 

       TempListener listener=new TempListener(); 

       factButton.addActionListener(listener); 

       factorialText = new JTextField(); 

       factorialText.addActionListener (new TempListener()); 

       add(inputLabel); 

       add(factorialText); 

       add(resultLabel); 

      } 

      //represents a listener for the button 

      private class TempListener implements ActionListener 

      { 

      //performs factorial operation when the 'Compute' button is pressed 

      public int computeFactorial(ActionEvent event) 

      { 

       int text=Integer.parseInt(factorial); 

       int f =1; 

       for(int i=text;i>=1;i--) 

       {  

         f = f*i; 

       } 

        resultLabel.setText(Integer.toString(f)); 

      } 

     } 

} 

Это следующие ошибки, которые я получаю, когда я пытаюсь скомпилировать:

.\Factorial.java:31: error: Factorial.TempListener is not abstract and does not override abstract method actionPerformed(ActionEvent) in ActionListener 
    private class TempListener implements ActionListener 
      ^
    .\Factorial.java:37: error: incompatible types: int cannot be converted to String 
        int text=Integer.parseInt(factorial); 
              ^
    Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output 
    2 errors 

Почему это не позволяет мне разобрать String factorial into и integer?

Также, как и где я могу вызвать метод computeFactorial для отображения значения объекта?

Спасибо! Любая помощь приветствуется!

+0

'factorial' объявлен как' int', а не 'String'. – Grayson

+1

'factorial' уже является' int', поэтому использование 'Integer.parseInt (String)' не будет работать, и даже если бы это было сделано, это было бы бесполезно. Ваш 'TempListener' должен объявить' public void actionPerformed (ActionEvent e) ', поскольку он реализует' ActionListener' –

ответ

1

Вместо использования factorial здесь, что уже int (отсюда и ошибка) ...

int text=Integer.parseInt(factorial); 

... Я думаю, что вы имели в виду, чтобы получить значение JTextField:

int text=Integer.parseInt(factorialText.getText()); 

Кроме того, если TempListener реализует ActionListener, вам необходимо следовать интерфейсу ActionListener. Метод называется actionPerformed() ...

public int actionPerformed(ActionEvent event) 

Вы не можете просто переименовать его, что вы хотите, как вы делали здесь:

public int computeFactorial(ActionEvent event) 

Наконец, на основе вашего комментария, другой вопрос Вас неправильно назвал ваш конструктор. Если ваш класс определен как:

public class Factorial extends JPanel 

Тогда ваш конструктор может быть:

public Factorial(int factorial) // note: no void and same name as class 
+0

Спасибо! Это избавило меня от моих ошибок компиляции. Теперь, когда программа запускается, панель пуста. Я думаю, что что-то не так с тем, как реализуется мой объект. –

1

Слушайте свой компилятор:

error: Factorial.TempListener is not abstract and does not override abstract method actionPerformed(ActionEvent) in ActionListener

Это просто для начинающего думать «О, нагрузка лепет, я попробую вещи, а не пытаюсь понять, что она говорит », - но вам нужно их понять, потому что они точно сообщают вам, о ком компилятор жалуется.

Вот это говорит вам, что, поскольку Factorial.TempListener реализует ActionListener, он ожидает, что у него будет метод actionPerformed(ActionEvent).

Если ActionListener был abstract, то будет разрешено не иметь этот метод - но тогда вы не смогли бы создать его экземпляр, так что просто добавление abstract не поможет.

Значит, вам нужно написать actionPerformed(ActionListener).

То, что должен сделать этот метод, находится за пределами того, для чего предназначено - читать и понимать книгу или учебник по Swing.

Без сомнения, после того, как вы исправите это, будет больше ошибок компилятора. Читай их; они обычно сообщают вам, где проблема.