2016-06-01 14 views
0

Das Ziel ist es, ein Programm zu erstellen, das eine GUI verwendet, um eine Fakultät zu berechnen. Ich muss ein jPanel oder jFrame erstellen, um die Ergebnisse des Programms anzuzeigen. Dann muss ich den Text von JTextField abrufen und es zu einem Integer analysieren, damit es an einen Konstruktor übergeben werden kann. Drittens muss eine Objektklasse mit einer Instanzvariable vom Typ int namens factorial erstellt werden. Diese Objektklasse benötigt einen einzelnen Argumentkonstruktor namens Factorial, der einen int akzeptiert und den Wert der Instanzvariablen zuweist. Dann sollte es eine Methode haben, die die Fakultät unter Verwendung einer for-Schleife mit einem Rückgabetyp von int berechnet. Schließlich sollte der Wert des Objekts angezeigt werden, nachdem die Methode aufgerufen wurde, die die Fakultät berechnet. Hier ist meine bisherige Arbeit.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); 

    } 

} 

Und meine nächste Datei ist die Objektklasse:

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)); 

      } 

     } 

} 

Dies sind die folgenden Fehler, die ich bekomme, wenn ich zu kompilieren versuchen:

.\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 

Warum es mich nicht analysieren der String factorial in und Integer?

Wie und wo kann ich die computeFactorial-Methode aufrufen, um den Wert des Objekts anzuzeigen?

Vielen Dank! Jede Hilfe wird geschätzt!

+0

'factorial' wird als' int' deklariert, nicht als 'String'. – Grayson

+1

'factorial' ist bereits ein' int', also wird die Verwendung von 'Integer.parseInt (String)' nicht funktionieren, und selbst wenn dies der Fall wäre, wäre es nutzlos. Ihr 'TempListener' muss 'public void actionPerformed (ActionEvent e)' deklarieren, da es 'ActionListener' implementiert –

Antwort

1

Statt factorial hier zu verwenden, die bereits ein int (daher der Fehler) ...

int text=Integer.parseInt(factorial); 

... Ich glaube, Sie den JTextField Wert zu erhalten bedeuten:

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

Wenn TempListenerActionListener implementiert, müssen Sie außerdem der Schnittstelle ActionListener folgen. Das Verfahren wird actionPerformed() genannt ...

public int actionPerformed(ActionEvent event) 

Sie können nicht nur benennen Sie sie um, was Sie wollen, wie Sie hier tat:

public int computeFactorial(ActionEvent event) 

Schließlich basierend auf Ihren Kommentar, ein anderes Problem, das Sie ist Den Konstruktor falsch benannt. Wenn Ihre Klasse ist wie folgt definiert:

public class Factorial extends JPanel 

Dann könnte Ihr Konstruktor sein:

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

Danke! Das hat meine beiden Kompilierungsfehler beseitigt. Jetzt, wenn das Programm läuft, ist das Panel leer. Ich denke, mit der Art und Weise, wie mein Objekt implementiert wird, stimmt etwas nicht. –

1

zu Ihrem Compiler Anhören:

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

Es ist einfach für Anfänger „Oh denken, das ist eine Menge Geplapper, ich probiere Zeug aus, anstatt zu versuchen, zu verstehen, was es sagt "- aber Sie müssen sie verstehen, weil sie Ihnen genau sagen, worüber der Compiler sich beschwert.

Hier ist es Ihnen sagen, dass, weil Factorial.TempListener implementiert ActionListener, erwartet es eine Methode actionPerformed(ActionEvent).

Wenn ActionListener waren abstract, würde es diese Methode nicht erlaubt sein - aber dann würden Sie nicht in der Lage sein, es zu instanziieren, so dass nur das Hinzufügen abstract wird nicht helfen.

So müssen Sie actionPerformed(ActionListener) schreiben.

Was diese Methode tun sollte, ist jenseits dessen, wofür SO ist - lesen und verstehen Sie ein Buch oder eine Anleitung zu Swing.

Kein Zweifel, sobald Sie dies beheben, wird es mehr Compilerfehler geben. Lese sie; Sie sagen normalerweise, wo das Problem liegt.