Elemente aus einer anderen GUI steuern!

  • Themenstarter Themenstarter Gelöschtes Mitglied 54220
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 54220

Gast
Hallo!
Ich bin momentan dabei eine GUI zu programmieren!
Nur leider scheitere ich bei dem Versuch Elemente aus einer anderen GUI-Klasse zu steuern!

Hier einmal der Code der Hauptklasse, wo sich das JLabel befindet, was ich steuern möchte:
http://pastebin.com/XnRzqc5F

Und hier der Code der GUI-Klasse, aus der das JLabel gesteuert werden soll:
http://pastebin.com/uWUfgbWQ
http://pastebin.com/uWUfgbWQ
Ich hoffe Ihr könnt mir helfen!
Vielen Dank im vorraus
 
Was heißt denn gesteuert?
Ich kann jetzt nur raten, aber ich denke mal, dass du den Text ändern willst?

Dann musst du in deiner Klasse wo das JLabel definiert ist einen Setter (und Getter falls nötig / gebraucht wird) implementieren mit dem du den Text änderst / ausgibst.
Das kann bswp. so aussehen:

Java:
public class GUI
{
     GUILogin guiLogin;

     public GUI()
     {
         guiLogin = new GUILogin();
         guiLogin.setLabelText("Foobar");
     }
}

Java:
public class GUILogin
{
    private JLabel label;

    public GUILogin()
    {
         label = new JLabel("bar");
         ...
    }

    public void setLabelText(String text)
    {
        this.label.setText(text);
    }

    public String getLabelText()
    {
         return this.label.getText();
    }
}

Hat es einen tieferen Sinn, dass deine Variablen static sind?
Ist eigentlich unnötig.

Gruß
Robert
 
Was heißt denn gesteuert?
Ich kann jetzt nur raten, aber ich denke mal, dass du den Text ändern willst?

Dann musst du in deiner Klasse wo das JLabel definiert ist einen Setter (und Getter falls nötig / gebraucht wird) implementieren mit dem du den Text änderst / ausgibst.
Das kann bswp. so aussehen:

Java:
public class GUI
{
     GUILogin guiLogin;

     public GUI()
     {
         guiLogin = new GUILogin();
         guiLogin.setLabelText("Foobar");
     }
}

Java:
public class GUILogin
{
    private JLabel label;

    public GUILogin()
    {
         label = new JLabel("bar");
         ...
    }

    public void setLabelText(String text)
    {
        this.label.setText(text);
    }

    public String getLabelText()
    {
         return this.label.getText();
    }
}

Hat es einen tieferen Sinn, dass deine Variablen static sind?
Ist eigentlich unnötig.

Gruß
Robert

Hat nicht so ganz funktioniert...

Habe jetzt in der Hauptklasse das hier reingepackt:
Java:
    public void setLabelText(String text) {
        this.TextN.setText(text);
    }
  
    public String getLabelText() {
        return this.TextN.getText();
    }

In der anderen Klasse beim actionPerformed event das so geändert:
Java:
    static class ActionCheck implements ActionListener {
      
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == btnLogin) {
                String e1 = user.getText();
                String e2 = passwd.getText();
              
                if (e1.equalsIgnoreCase("Wood14Mine")) {
                    if(e2.equalsIgnoreCase("woodi")) {
                        GUI guimain;
                      
                        guimain = new GUI();
                        guimain.setLabelText("Wood14Mine");
                    }
                }
            }
        }
    }

Was habe ich falsch gemacht?
 
Zuletzt bearbeitet von einem Moderator:
Hätte mich auch genauer ausdrücken können 😛
Was ich meinte ist, dass du mal schauen sollst, ob deine Bedingung erfüllt ist und der den Code überhaupt ausführt.
Das kannst du bswp machen indem du einfach mal dort was ausgibst.

Java:
   staticclass ActionCheck implements ActionListener{
   
       publicvoid actionPerformed(ActionEvent e){
           if(e.getSource()== btnLogin){
               String e1 = user.getText();
               String e2 = passwd.getText();
           
               if(e1.equalsIgnoreCase("Wood14Mine")){
                   if(e2.equalsIgnoreCase("woodi")){
                     
                      System.out.println("Er geht in die if");                   
  
                     GUI guimain;
                   
                        guimain =new GUI();
                        guimain.setLabelText("Wood14Mine");
                   }
               }
           }
       }

EDIT:
Wenn in deiner Console dann nicht "Er geht in die if" steht, dann weißt du wo der Fehler liegt. Dann solltest du dir als nächstes mal die Werte von e1 und e2 anschauen 🙂
 
Zuletzt bearbeitet:
Hätte mich auch genauer ausdrücken können 😛
Was ich meinte ist, dass du mal schauen sollst, ob deine Bedingung erfüllt ist und der den Code überhaupt ausführt.
Das kannst du bswp machen indem du einfach mal dort was ausgibst.

Java:
   staticclass ActionCheck implements ActionListener{
  
       publicvoid actionPerformed(ActionEvent e){
           if(e.getSource()== btnLogin){
               String e1 = user.getText();
               String e2 = passwd.getText();
          
               if(e1.equalsIgnoreCase("Wood14Mine")){
                   if(e2.equalsIgnoreCase("woodi")){
                    
                      System.out.println("Er geht in die if");                  
 
                     GUI guimain;
                  
                        guimain =new GUI();
                        guimain.setLabelText("Wood14Mine");
                   }
               }
           }
       }

EDIT:
Wenn in deiner Console dann nicht "Er geht in die if" steht, dann weißt du wo der Fehler liegt. Dann solltest du dir als nächstes mal die Werte von e1 und e2 anschauen 🙂

Die Schleife funktioniert! Daran liegt es nicht...
 
Okay.. ich denke ich habe die passende Lösung für dich.
(Hab jetzt erst gemerkt, dass du was vollkommen anderes erreichen wolltest als ich dachte)

Du willst also, dass das Label sichtbar wird sobald man sich richtig einloggt.
Das machst du am besten so:

Java:
    class ActionLogin implements ActionListener {
    
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == btn1) {
                JFrame GUILogin = new GUILogin(TextN);   // <---- Du übergibst deinem Konstruktor von GUILogin als Param das JLabel
                GUILogin.setVisible(true);
            }
        }
    }
Du übergibst deinem Konstruktor von GUILogin als Parameter dein JLabel, was du sichtbar machen willst.
Daher musst du auch in deinem GUILogin Klasse den Konstruktor bearbeiten:

Java:
JLabel TextN;  //<-- Globale variable in deiner GUILogin Klasse

public GUILogin(JLabel TextN) {  // <-- Neuer Konstruktor

        this.TextN = TextN;
           ..
}

Damit kannst du jetzt in deiner GUILogin Klasse auf das JLabel aus der GUI Klasse zugreifen.

Jetzt musst du nur noch einer deiner ActionCheck Klasse die actionPerformed Methode anpassen:

Java:
class ActionCheck implements ActionListener {
    
        public void actionPerformed(ActionEvent e) {
          // ...   
          if (e1.equalsIgnoreCase("Wood14Mine")) {
                    if(e2.equalsIgnoreCase("woodi")) {
                       // das funktioniert!
                       TextN.setVisible(true);   // <-- NEU
                    }
                }
            }
        }
    }

Das sollte dein Problem jetzt beheben.

------

Bitte beachte folgendes:

Es gibt in Java gewisse Konventionen, die man einhalten sollte um es für andere und sich selbst leichter zu machen.

Dazu gehört:

- Variablennamen sinnvoll wählen (TextN --> labelUserName oder lblUserName o.ä.)

- Variablennamen im CammelCase (TextN --> textN)

- Vermeide innere Klassen zu machen. Du kannst sie auslagern.

- Ich würde dir raten nicht für jeden Action eine eigne Klasse zu machen. Pro GUI eine Klasse ActionListenerLogin und ActionListenerGUI reichen aus. Dort kannst du dann mittels if Abfragen schauen, welches Element deienr Klasse angesprochen wird.

- Vermeide static ausdrücke. Macht das Leben nur unnötig kompliziert 🙂 (gerade wenn man sie eig gar nicht braucht)

- Man extended seine Klasse normaler weise nicht mit JFrame. Du willst die funktionalität von JFrame ja nicht erweitern sondern nur die Methoden betnutzen --> Instanze von JFrame benutzen

- Trenne dein Programm immer sauber nach MVC (Model, View, Controller) also immer GUI von Logik trennen.

Am besten versuchst du dein Programm gleich mal zu bearbeiten - lieber gleich richtig 🙂

Gruß
Robert
 
Zuletzt bearbeitet:
Okay.. ich denke ich habe die passende Lösung für dich.
(Hab jetzt erst gemerkt, dass du was vollkommen anderes erreichen wolltest als ich dachte)

Du willst also, dass das Label sichtbar wird sobald man sich richtig einloggt.
Das machst du am besten so:

Java:
    class ActionLogin implements ActionListener {
    
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == btn1) {
                JFrame GUILogin = new GUILogin(TextN);   // <---- Du übergibst deinem Konstruktor von GUILogin als Param das JLabel
                GUILogin.setVisible(true);
            }
        }
    }
Du übergibst deinem Konstruktor von GUILogin als Parameter dein JLabel, was du sichtbar machen willst.
Daher musst du auch in deinem GUILogin Klasse den Konstruktor bearbeiten:

Java:
JLabel TextN;  //<-- Globale variable in deiner GUILogin Klasse

public Test(JLabel TextN) {  // <-- Neuer Konstruktor

        this.TextN = TextN;
           ..
}

Damit kannst du jetzt in deiner GUILogin Klasse auf das JLabel aus der GUI Klasse zugreifen.

Jetzt musst du nur noch einer deiner ActionCheck Klasse die actionPerformed Methode anpassen:

Java:
class ActionCheck implements ActionListener {
    
        public void actionPerformed(ActionEvent e) {
          // ...   
          if (e1.equalsIgnoreCase("Wood14Mine")) {
                    if(e2.equalsIgnoreCase("woodi")) {
                       // das funktioniert!
                       TextN.setVisible(true);   // <-- NEU
                    }
                }
            }
        }
    }

Das sollte dein Problem jetzt beheben.

------

Bitte beachte folgendes:

Es gibt in Java gewisse Konventionen, die man einhalten sollte um es für andere und sich selbst leichter zu machen.

Dazu gehört:

- Variablennamen sinnvoll wählen (TextN --> labelUserName oder lblUserName o.ä.)

- Variablennamen im CammelCase (TextN --> textN)

- Vermeide innere Klassen zu machen. Du kannst sie auslagern.

- Ich würde dir raten nicht für jeden Action eine eigne Klasse zu machen. Pro GUI eine Klasse ActionListenerLogin und ActionListenerGUI reichen aus. Dort kannst du dann mittels if Abfragen schauen, welches Element deienr Klasse angesprochen wird.

- Vermeide static ausdrücke. Macht das Leben nur unnötig kompliziert 🙂 (gerade wenn man sie eig gar nicht braucht)

- Man extended seine Klasse normaler weise nicht mit JFrame. Du willst die funktionalität von JFrame ja nicht erweitern sondern nur die Methoden betnutzen --> Instanze von JFrame benutzen

- Trenne dein Programm immer sauber nach MVC (Model, View, Controller) also immer GUI von Logik trennen.

Am besten versuchst du dein Programm gleich mal zu bearbeiten - lieber gleich richtig 🙂

Gruß
Robert

Geht nicht.. Schau mal:

fehler1gis0a.png


fehler2n3syu.png


Programmiere übrigens mit Eclipse
 
Ist keine Aussage 😉

Ohne Fehlermeldung kann ich nur ins grüne raten:

Ich schätze mal du hast vergessen deinen Konstruktor anzupassen und deine variable in GUILogin noch nicht definiert.

Deine GUILogin Klasse sollte am Anfang jetzt so aussehen:
Java:
public class GUILogin extends JFrame
{
    JLabel TextN;
    JLabel Text3;
    ... (die anderen Variablen)
   
    public GUILogin(JLabel TextN)
    {
        this.TextN = TextN;
        setLayout(..)
        ...
    }

     ....

    
    static class ActionCheck implements ActionListener {
       
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == btnLogin) {
                String e1 = user.getText();
                String e2 = passwd.getText();
               
                if (e1.equalsIgnoreCase("Wood14Mine")) {
                    if(e2.equalsIgnoreCase("woodi")
                        TextN.setVisible(true);
                    }
                }
            }
        }
    }
}
 
Zuletzt bearbeitet:
Ist keine Aussage 😉

Ohne Fehlermeldung kann ich nur ins grüne raten:

Ich schätze mal du hast vergessen deinen Konstruktor anzupassen und deine variable in GUILogin noch nicht definiert.

Deine GUILogin Klasse sollte am Anfang jetzt so aussehen:
Java:
public class GUILogin extends JFrame
{
    JLabel TextN;
    JLabel Text3;
    ... (die anderen Variablen)
  
    public GUILogin(JLabel TextN)
    {
        this.TextN = TextN;
        setLayout(..)
        ...
    }

     ....

   
    static class ActionCheck implements ActionListener {
      
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == btnLogin) {
                String e1 = user.getText();
                String e2 = passwd.getText();
              
                if (e1.equalsIgnoreCase("Wood14Mine")) {
                    if(e2.equalsIgnoreCase("woodi")
                        TextN.setVisible(true);
                    }
                }
            }
        }
    }
}

Hey!
Habe jetzt es genauso wie in deinem Code.

Hier die Fehlermeldungen:
fehler1gis0a.png

Cannot make a static reference to the non-static field TextN
Vorgeschlagene Lösung: Change 'TextN' to 'static'

fehler2n3syu.png

Cannot make a static reference to the non-static field TextN
Vorgeschlagene Lösung: Change 'TextN' to 'static'
 
Deswegen sag ich ja, dass du das static weg machen sollst 😉

aus

Java:
static JLabel TextN;

static class ActionCheck implements ActionListener {
    ...
}

soll

Java:
JLabel TextN;

class ActionCheck implements ActionListener {
    ...
}

werden..

Dass du deine inneren Klassen und Variablen als static deklariert hast ergibt keinen Sinn und ist unnötig. Hau einfach über all das static weg.

Und das gilt für alle Variablen und Klassen / Methoden die du hast.

(ausser die main natürlich 😉 )

PS: das ich das oben in meinem Bsp. noch als static deklariert habe war ein Fehler (durchs copy pasten 😛 )
 
Vielen vielen Dank! Du hast mir sehr geholfen! Ich habe jetzt auch wieder ein bisschen was neues Dank Dir gelernt! Dürfte ich Dich auch privat anschreiben, wenn ich mal wieder ein Problem hab?
 

Zurück
Oben