Reihenfolge der Komponenten im einem JFrame

trytocatch

Mitglied
Hey Leute,

immer wieder passiert es mir, dass z.B. ein JLabel nicht aufgelöst ("cannot be resolved") werden kann. Dann kopiere ich die Komponten immer wild im Code umher, dass es halt am Ende passt.

Gibt es eine bestimmte Reihenfolge, wie z.B. JLabels -> TextFields-> Buttons oder ein anderes Schema, mit dem solche Probleme nicht auftreten und trotzdem die Struktur gewahrt wird?

LG
 
Ich denke dein Problem bezieht sich nicht explizit auf UI-Komponenten sondern generell auf die Sichtbarkeit von Variablen.
Prinzipiell muss eine Variable erst bekannt sein bevor du sie benutzt. d.h. sowas hier
Java:
public static void main(String[] args) {
    System.out.println(a);
    int a = 5;
}
würde immer zu einem Fehler führen. Das gilt natürlich für alle Datentypen.

Genaueres kann man aber nur sagen wenn du mal ein Beispielcode zeigst, bei dem der Fehler auftritt. Eine festgelegte Reihenfolge (ob nun erst Labels und dann Buttons, o.ä.) gibt es nicht. Wichtig ist die Reihenfolge wie / wann du es deklarierst / initialisierst. Wildes rum kopieren und hoffen das es hilft ist jedenfalls nicht der richtige Weg.
 
Hey ich glaube auch, dass das daran liegt. Aber ich dachte man könnte das durch bestimmte Reihenfolgen beheben.
Hier ist ein Teil meines Quellcodes:
Dabei tritt im ActionListener beim lblNotennummer das Problem auf, dass es nciht resolved werden kann.
Wenn ich es davor in code kopiere funktioniert es aber...
Gibt es da irgendeine Methode, wie man das von vorneherein richtig anordnen kann? Oder muss ich mir jedes mal überlegen und dann doch rumkopieren?
LG und danke schonmal!!
Java:
btnNoteUebernehmen = new JButton("\u00DCbernehmen");
   btnNoteUebernehmen.addActionListener(new ActionListener() {
       public void actionPerformed(ActionEvent e) {
           if (!tfNote.getText().equals("")
               && Double.parseDouble(tfNote.getText()) >= 1
               && Double.parseDouble(tfNote.getText()) <= 6) {
               summe = summe + Double.parseDouble(tfNote.getText());
               notenschnitt = summe / i;
               noten[i-1]=Double.parseDouble(tfNote.getText());
               lblNotenschnitt.setText("Notenschnitt: "
                   + fzahl.format(notenschnitt));
               lblNotenzahl.setText("Anzahl eingegebene Noten: "
                   + Integer.toString(i));

               if (Double.parseDouble(tfNote.getText()) > schlechtesteNote) {
               schlechtesteNote = Double.parseDouble(tfNote.getText());
               lblSchlechtesteNote.setText("schlechteste Note: "
                   + Double.toString(schlechtesteNote));
               }
               if (Double.parseDouble(tfNote.getText()) < besteNote) {
               besteNote = Double.parseDouble(tfNote.getText());
               lblBesteNote
                   .setText("beste Note: " + Double.toString(besteNote));
               }
               if (i == notenzahl) {
               notenschnitt = summe / notenzahl;
               btnNoteUebernehmen.setVisible(false);
               btnNeu.setVisible(true);
               lblNoten.setText("Noten: ");
               for (int i=0; i<noten.length;i++) {
                   lblNoten.setText(lblNoten.getText()+" "+noten[i]);
               }
               lblNotennummer.setVisible(true);
               tfNotennummer.setVisible(true);
               btnNotennummer.setVisible(true);
               } else {
               i++;
               lblNote.setText(Integer.toString(i) + ".Note");
               tfNote.setText("");
               tfNote.requestFocus();
               }
               
           } else {
               JOptionPane.showMessageDialog(null, "gültige Note eingeben!");
               tfNote.requestFocus();
           }
       }
   });
   btnNoteUebernehmen.setVisible(false);
   btnNoteUebernehmen.setBounds(117, 83, 129, 23);
   contentPane.add(btnNoteUebernehmen);
   
   lblNotenzahl = new JLabel("");
   lblNotenzahl.setBounds(10, 120, 236, 14);
   contentPane.add(lblNotenzahl);
   
   lblNotenschnitt = new JLabel("");
   lblNotenschnitt.setBounds(10, 145, 236, 14);
   contentPane.add(lblNotenschnitt);
   
   lblBesteNote = new JLabel("");
   lblBesteNote.setBounds(10, 170, 236, 14);
   contentPane.add(lblBesteNote);
   
   lblSchlechtesteNote = new JLabel("");
   lblSchlechtesteNote.setBounds(10, 198, 236, 14);
   contentPane.add(lblSchlechtesteNote);
   

   

   
   tfNotennummer = new JTextField();
   tfNotennummer.setBounds(256, 84, 51, 20);
   contentPane.add(tfNotennummer);
   tfNotennummer.setColumns(10);
   tfNotennummer.setVisible(false);
   
   
   
   JLabel lblNotennummer = new JLabel("Notennummer bearbeiten");
   lblNotennummer.setBounds(317, 87, 134, 14);
   contentPane.add(lblNotennummer);
   lblNotennummer.setVisible(false);
 
Mit probieren hat das nicht viel am Hut.
Man sollte als Programmierer einfach den Überblick haben wo man welche Komponenten braucht, wie die Abhängigkeiten sind und wann diese zu deklarieren sind.

Ob man sich das vorher durch Aufzeichnungen klar macht oder es im Kopf kann ist vom Programmier und der Größe des Programmes abhängig.
 
Aber ich dachte man könnte das durch bestimmte Reihenfolgen beheben.
Das stimmt. Dein Problem ist, dass Du Deinen Code generell nicht strukturierst.
Eine Beispiel:
Code:
     if (!tfNote.getText().equals("")
                && Double.parseDouble(tfNote.getText()) >= 1
                && Double.parseDouble(tfNote.getText()) <= 6) {
                summe = summe + Double.parseDouble(tfNote.getText());
                notenschnitt = summe / i;
Hier liest Du einen Doublewert aus einem TextFeld aus. Wenn ich Deine Vorstellung richtig interpretiere, sollen da Noten von 1 - 6 herauskommen.
Aufgabe nach einem Buttonklick:
1) Text auslesen.
2) Text in ganze Zahl umwandeln eventuelle Fehler abfangen.
3) Bereich prüfen
4) Wenn ok die gültige Eingabe speichern und Berechnung machen. Sonst Textfeld auf den letzten gültigen Wert setzen.
Du liest den Text hier 4 mal aus. (3 x zu oft). Fängst einen möglichen Fehler nicht ab.
Die Variablen summe und notenschnitt sollten keine Attribute deiner Klasse sein. Es genügt die eingegebenen Noten und die Position der Eingabe im Notenarray zu speichern. Den Notenschnitt solltest Du über ein Funktion getNotenSchnitt() zur Verfügung stellen.
Code:
public double getNotenSchnitt() {
        int summe = 0;
        for( int note: noten )
            summe+= note;
        return summe/ (double)noten.length;
    }
Auch die Namen Deiner Variablen sind nicht gerade günstig gewählt.
'i' meint hier wohl den augenblicklichen Index im Array der Noten. ( z.B. currentMarkId )
usw.
 

Neue Themen


Zurück
Oben