2016-04-21 7 views
0

Hallo Ich arbeite an diesem Projekt, um Namen von Schülern zu speichern und ihre Noten zu notieren. Ich habe das gesamte Programm ausgearbeitet und alles, was ich jetzt tun muss, ist, die Ganzzahlen und Strings aus der Benutzereingabe aufzuzeichnen und sie aus verschiedenen Klassen aufzurufen. Ich habe Probleme damit. Benütze ich ein Array? Wie rufe ich von einer anderen Klasse an? Vielen Dank.Wie speichern String oder Integer in java.swing JTextField?

package gradebook; 

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 
import javax.swing.JButton; 
import java.awt.event.ActionListener; 
import java.util.Scanner; 
import java.awt.event.ActionEvent; 
import javax.swing.JTextArea; 

public class Student extends JFrame { 
    private JFrame studentFrame; 
    private JPanel contentPane; 
    private JTextField studentNameTextField; 
    protected Component frame; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        Student frame = new Student(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public Student() { 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     contentPane.setLayout(null); 

     JLabel gradebookLabel = new JLabel("Gradebook"); 
     gradebookLabel.setBounds(189, 6, 68, 16); 
     contentPane.add(gradebookLabel); 

     JLabel lblPleaseEnterThe = new JLabel("Please enter the student name"); 
     lblPleaseEnterThe.setBounds(130, 105, 194, 16); 
     contentPane.add(lblPleaseEnterThe); 

     studentNameTextField = new JTextField("Enter here"); 
     String stdname = studentNameTextField.getText(); 
     studentNameTextField.setBounds(130, 133, 194, 26); 
     contentPane.add(studentNameTextField); 
     studentNameTextField.setColumns(10); 

     JButton continueButton = new JButton("Continue"); 
     continueButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent a) { 
       if(continueButton.isEnabled()){ 
       Student.this.dispose(); 
        Student studentScreen = new Student(); 
        studentScreen.dispose(); 

        AddGrades addGradesScreen = new AddGrades(); 
        addGradesScreen.setVisible(true); 


       } 
      } 
     }); 
     continueButton.setBounds(327, 243, 117, 29); 
     contentPane.add(continueButton); 

     JButton cancelButton = new JButton("Cancel"); 
     cancelButton.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent a) { 


       if(cancelButton.isEnabled()){ 




        MainScreen mainScreenScreen = new MainScreen(); 
        mainScreenScreen.setVisible(true); 
        contentPane.setVisible(false); 
        contentPane.disable(); 


       } 
      } 
     }); 


     cancelButton.setBounds(207, 243, 117, 29); 
     contentPane.add(cancelButton); 
    } 

    private void initizalize() { 
     // TODO Auto-generated method stub 

    } 
} 

Ist es in etwa so?

studentNameTextField = new JTextField("Enter here"); 
     String stdname = studentNameTextField.getText(); 

Ich weiß, das es zu speichern wäre, aber wie rufe ich in einer anderen Klasse, so kann ich es auf einem anderen Rahmen erscheinen lassen?

Update: Okay, so habe ich diesen

Student frame = new Student(); 
     String stdname = frame.studentNameTextField.getText(); 
     JLabel addgradesLabel = new JLabel("Add grades for" + frame.studentNameTextField); 
     addgradesLabel.setBounds(139, 34, 167, 29); 
     contentPane.add(addgradesLabel); 

getan und es funktioniert immer noch nicht. Ich glaube, ich implementiere das nicht richtig. Ich versuche, das Etikett mit dem zu benennen, was der Benutzer für den Namen eingibt. Also würde es aber "Noten hinzufügen für" + stdname Aber es wird nicht korrekt aufgerufen. Wie kann ich das beheben?

Hier ist mein Code aus der AddStudentName Klasse

studentNameTextField = new JTextField(); 
     studentNameTextField.setBounds(130, 133, 194, 26); 
     contentPane.add(studentNameTextField); 
     studentNameTextField.setColumns(10); 

     JButton continueButton = new JButton("Continue"); 
     continueButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent a) { 
       if(continueButton.isEnabled()){ 
       Student.this.dispose(); 
        Student studentScreen = new Student(); 
        studentScreen.dispose(); 


        AddGrades addGradesScreen = new AddGrades(); 
        addGradesScreen.setVisible(true); 




       } 
      } 
     }); 

Was soll ich hier hinzufügen, um die Eingabe zu speichern, dass der Benutzer in die JTextField eingibt? Danke für die Hilfe

Hier ist der vollständige Code für die Klassen:

package gradebook; 

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 
import javax.swing.JButton; 
import java.awt.event.ActionListener; 
import java.util.Scanner; 
import java.awt.event.ActionEvent; 
import javax.swing.JTextArea; 

public class Student extends JFrame { 
    private JFrame studentFrame; 
    private JPanel contentPane; 
    public JTextField studentNameTextField; 
    protected Component frame; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        Student frame = new Student(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public Student() { 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     contentPane.setLayout(null); 

     JLabel gradebookLabel = new JLabel("Gradebook"); 
     gradebookLabel.setBounds(189, 6, 68, 16); 
     contentPane.add(gradebookLabel); 

     JLabel lblPleaseEnterThe = new JLabel("Please enter the student name"); 
     lblPleaseEnterThe.setBounds(130, 105, 194, 16); 
     contentPane.add(lblPleaseEnterThe); 


     JTextField studentNameTextField = new JTextField(); 

     studentNameTextField.setBounds(130, 133, 194, 26); 
     contentPane.add(studentNameTextField); 
     studentNameTextField.setColumns(10); 

     JButton continueButton = new JButton("Continue"); 
     continueButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent a) { 
       if(continueButton.isEnabled()){ 

        Student studentScreen = new Student(); 
        studentScreen.dispose(); 

        AddGrades addGradesScreen = new AddGrades(); 
        addGradesScreen.setVisible(true); 



       } 
      } 
     }); 


     continueButton.setBounds(327, 243, 117, 29); 
     contentPane.add(continueButton); 

     JButton cancelButton = new JButton("Cancel"); 
     cancelButton.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent a) { 


       if(cancelButton.isEnabled()){ 




        MainScreen mainScreenScreen = new MainScreen(); 
        mainScreenScreen.setVisible(true); 
        contentPane.setVisible(false); 
        contentPane.disable(); 


       } 
      } 
     }); 


     cancelButton.setBounds(207, 243, 117, 29); 
     contentPane.add(cancelButton); 
    } 

    private void initizalize() { 
     // TODO Auto-generated method stub 

    } 
} 

und:

package gradebook; 

import java.awt.BorderLayout; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 
import javax.swing.JButton; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

public class AddGrades extends JFrame { 

    private JPanel contentPane; 
    private JTextField Assignment1; 
    private JTextField Assignment2; 
    private JTextField Assignment3; 
    private JTextField Assignment4; 
    private JLabel testsLabel; 
    private JTextField Test1; 
    private JTextField Test2; 
    public JTextField Test3; 
    public JTextField Test4; 

    /** 
    * Launch the application. 
    */ 
    public JFrame frame; 
    public JButton continueButton; 
    public JButton exitButton; 
    public static void main(String[] args) { 
     AddGrades frame = new AddGrades(); 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        AddGrades frame = new AddGrades(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public AddGrades() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     contentPane.setLayout(null); 

     JLabel gradebookLabel = new JLabel("Gradebook"); 
     gradebookLabel.setBounds(189, 6, 68, 16); 
     contentPane.add(gradebookLabel); 


     JLabel addgradesLabel = new JLabel("Add grades for" + stdname); 
     addgradesLabel.setBounds(139, 34, 167, 29); 
     contentPane.add(addgradesLabel); 

     JLabel assignmentsLabel = new JLabel("Assignments:"); 
     assignmentsLabel.setBounds(19, 75, 86, 16); 
     contentPane.add(assignmentsLabel); 

     Assignment1 = new JTextField(); 
     Assignment1.setBounds(54, 91, 130, 26); 
     contentPane.add(Assignment1); 
     Assignment1.setColumns(10); 

     Assignment2 = new JTextField(); 
     Assignment2.setBounds(54, 129, 130, 26); 
     contentPane.add(Assignment2); 
     Assignment2.setColumns(10); 

     Assignment3 = new JTextField(); 
     Assignment3.setBounds(54, 167, 130, 26); 
     contentPane.add(Assignment3); 
     Assignment3.setColumns(10); 

     Assignment4 = new JTextField(); 
     Assignment4.setBounds(54, 205, 130, 26); 
     contentPane.add(Assignment4); 
     Assignment4.setColumns(10); 

     testsLabel = new JLabel("Tests:"); 
     testsLabel.setBounds(243, 75, 38, 16); 
     contentPane.add(testsLabel); 

     Test1 = new JTextField(); 
     Test1.setBounds(262, 91, 130, 26); 
     contentPane.add(Test1); 
     Test1.setColumns(10); 

     Test2 = new JTextField(); 
     Test2.setBounds(262, 129, 130, 26); 
     contentPane.add(Test2); 
     Test2.setColumns(10); 

     Test3 = new JTextField(); 
     Test3.setBounds(262, 167, 130, 26); 
     contentPane.add(Test3); 
     Test3.setColumns(10); 

     Test4 = new JTextField(); 
     Test4.setBounds(262, 205, 130, 26); 
     contentPane.add(Test4); 
     Test4.setColumns(10); 

     continueButton = new JButton("Continue"); 
     continueButton.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent a){ 
       if (continueButton.isEnabled()){ 

        MainScreen mainScreenScreen = new MainScreen(); 
        mainScreenScreen.setVisible(true); 

       } 


      } 
     }); 
     continueButton.setBounds(327, 243, 117, 29); 
     contentPane.add(continueButton); 

     exitButton = new JButton("Exit"); 

     exitButton.setBounds(208, 243, 117, 29); 
     contentPane.add(exitButton); 
    } 
} 

Ich versuche, die Eingabe von der JTextField

JTextField studentNameTextField = new JTextField(); 

zu nehmen und setze es auf das Etikett

JLabel addgradesLabel = new JLabel("Add grades for" + stdname); 

Dabei wäre stdname die Benutzereingabe aus dem JTextField.

Jetzt bin ich erhalte Fehler von

public static void main(String[] args) { 
     AddGrades frame = new AddGrades(); 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        AddGrades frame = new AddGrades(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

AddGrades frame = new AddGrades(); gibt mir Fehlerargument hinzufügen AddGrades übereinstimmen (String)

Der Konstruktor AddGrades()

undefiniert ist
+0

Wie nennen Sie was von einer anderen Klasse? Klären Sie Ihre Frage. Es scheint auf den ersten Blick, dass Sie ein wenig über Java und OOP im Allgemeinen lernen müssen. – Cyb3rFly3r

+0

Sollte jetzt beantwortet werden - siehe meine Bearbeitung. – nhouser9

Antwort

1

Bearbeiten: Der beste Weg, dies zu tun ist, übergeben Sie ein Argument an Ihre neu erstellte AddGrades-Klasse. Siehe unten:

public AddGrades(String stdname) { 
    JLabel addgradesLabel = new JLabel("Add grades for " + stdname); 
} 

Sie müssen Ihren Code ändern, um eine Zeichenfolge zu Ihrer AddGrades Klasse übergeben, wo Sie es schaffen:

JButton continueButton = new JButton("Continue"); 
continueButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent a) { 
     if(continueButton.isEnabled()){ 

      Student studentScreen = new Student(); 
      studentScreen.dispose(); 

      AddGrades addGradesScreen = new AddGrades(studentNameTextField.getText()); 
      addGradesScreen.setVisible(true); 
     } 
    } 
}); 

die für mich gearbeitet - ich heruntergeladen Code und getestet.

+0

Ich habe das versucht, aber ich glaube, dass ich das nicht richtig implementiere. Ich habe meinen ursprünglichen Post mit etwas mehr Code aktualisiert. Danke – adabun

+0

@Adam Basierend auf Ihrem Code sieht es so aus, als ob Sie dem Benutzer keine Zeit geben, irgendetwas einzugeben - der Student-Frame wird angezeigt, und sofort wird ein neues Label erstellt. Wenn das passiert, hat der Benutzer noch keinen Text eingegeben. Das Problem besteht darin, Action Listeners zu verwenden. Ich werde meine Antwort aktualisieren. – nhouser9

+0

Ich habe immer noch Probleme bei der Umsetzung Ihrer Vorschläge. Ich werde den vollständigen Code für diese beiden Klassen für Sie bereitstellen, wenn es Ihnen nichts ausmacht, können Sie einen Blick darauf werfen? – adabun

0

JSpinner oder JFormattedTextField wäre mein erster Gedanke sein, aber wenn Sie nicht, dass dann könnte man Integer.parseInt verwenden zu analysieren ein String zu int und ein NumberFormat die Zahlen

haben s String zu formatieren Vielleicht einen Blick auf How to Use Spinners und How to Use Formatted Text Fields für Starter

Ich weiß, das würde es speichern, aber wie nenne ich das in einer anderen Klasse, damit ich es auf einem anderen JFrame erscheinen lassen kann?

Das ist eine offene Frage mit wenig Kontext. Sie könnten eine Art von "Modell" verwenden, die einen oder mehrere Werte repräsentiert: Student; Sie könnten eine Observer Pattern verwenden, damit der Redakteur Ereignisse für interessierte Parteien generieren kann, die ihnen sagen würden, dass sich etwas geändert hat; Sie könnten ein Model-View-Controller verwenden; Sie können einen modalen Dialog verwenden und wenn er geschlossen ist, fragen Sie den Editor nach den Werten über Getter.

Werfen Sie einen Blick auf How to Make Dialogs um weitere Informationen zu

Eines der Dinge, die Sie im Auge behalten möchten, ist „Verantwortung“ und „Verkapselung“. Sie möchten nicht, dass externe Parteien unkontrollierten Zugriff auf Ihren Editor oder Ihr Modell haben. Dies könnte es ihnen ermöglichen, den Status unkontrolliert zu ändern, was zu Inkonsistenzen in Ihren Daten oder Ihrer Benutzeroberfläche führen würde.

Sie müssen entscheiden, wer tatsächlich für die Änderung des Zustands des Modells verantwortlich ist. Es gibt keine "richtige" Antwort, zum Beispiel könnten Sie den Editor entweder in der Lage sein, vorhandene Schülerobjekte zu bearbeiten oder neue zu erstellen, je nachdem, wie sie konfiguriert sind. Sie könnten auch den Editor "dumm" machen und einfach Setter verwenden Richte den Editor und die Getter ein, um die Werte zu erhalten.

Ihnen stehen viele Optionen zur Verfügung, die Sie basierend auf dem Kontext verwenden würden, in dem Sie sie verwenden möchten. Mein Bauchgefühl beginnt mit einem Beobachtermuster und einem modalen Dialog.

+0

Ich respektiere Sie wirklich und Sie sind ein Chef bei der Beantwortung von Fragen, also keine Respektlosigkeit, aber ich denke nicht, dass diese Antwort richtig ist. Seine Frage dreht sich darum, wie man auf den Wert in seinem Textfeld von einer anderen Klasse aus zugreifen kann, und das geht nicht darauf ein. – nhouser9

+0

@ nhouser9 Ja, der Titel und die Frage stimmen nicht überein: P. Überprüfe auch das Update, übrigens, um Kapselung wegzublasen;) – MadProgrammer