Event Handling Aus einer anderen Klasse heraus einen Text des JLabels ändern.

DerSchlangen

Mitglied
Hallo zusammen,
ich arbeite weiter fleißig an meinen Java Projekt zu welchen ich schon eine andere Frage gestellt habe ( http://www.java-forum.org/awt-swing-javafx-and-swt/167486-geoeffnetes-dialogfenster-schliessen.html ).
Nun habe ich das Übergeben der Daten aus dem Dialogfeld gemeistert und will die Eingabe der Daten im Hauptfenster Anzeigen. Leider funktioniert der Weg wie ich ihn mir gedacht habe nicht und ich hab auch mal wieder keine Ahnung. Ich erstelle eine Methode in der Hauptklasse jedoch kann ich sie nicht aus der Unterklasse aufrufen.

Ich hänge mal komplett beide Klassen an. Es geht um die Methode updateGUI und den Aufruf eben jener Methode in der neben Klasse.

Danke im vor raus.


Java:
package mainprog;
import formulare.Logindata_dialog;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import java.awt.Font;
import javax.swing.JButton;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class WvS_ProjectDB extends JFrame {
 private static final long serialVersionUID = 6049042076699458303L;
 private JPanel contentPane;
 private static String DbIpAdress;
 private static String DbPort;
 private static String DbName;
 private static String DbUser;
 private static String DbUserPasswd;
 private JLabel lbl_DBname;
 private JLabel lbl_PWD;
 Logindata_dialog dialog = new Logindata_dialog();
 
 
 
 
 public static void main(String[] args) {
  EventQueue.invokeLater(new Runnable() {
   public void run() {
    try {
     WvS_ProjectDB frame = new WvS_ProjectDB();
     frame.setVisible(true);
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  });
 }
 public WvS_ProjectDB() {
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setBounds(100, 100, 852, 629);
  contentPane = new JPanel();
  contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
  setContentPane(contentPane);
  contentPane.setLayout(null);
  
  JLabel lbl_Titel = new JLabel("WvS Techniker Projekt Datenbank");
  lbl_Titel.setHorizontalAlignment(SwingConstants.CENTER);
  lbl_Titel.setFont(new Font("Tahoma", Font.BOLD | Font.ITALIC, 30));
  lbl_Titel.setBounds(15, 16, 800, 81);
  contentPane.add(lbl_Titel);
  
  lbl_DBname = new JLabel("Keine Datenbank vorgew\u00E4hlt!");
  lbl_DBname.setFont(new Font("Tahoma", Font.BOLD, 16));
  lbl_DBname.setForeground(Color.RED);
  lbl_DBname.setBounds(15, 148, 272, 20);
  contentPane.add(lbl_DBname);
  
  lbl_PWD = new JLabel("Kein Password eingegeben!");
  lbl_PWD.setFont(new Font("Tahoma", Font.BOLD, 16));
  lbl_PWD.setForeground(Color.RED);
  lbl_PWD.setBounds(15, 187, 244, 20);
  contentPane.add(lbl_PWD);
  
  JButton btn_login = new JButton("Logindaten eingeben");
  btn_login.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent arg0) {
    dialog.setVisible(true);
   }
  });
  btn_login.setBounds(25, 225, 233, 29);
  contentPane.add(btn_login);
 }
 public static String getDbIpAdress() {
  return DbIpAdress;
 }
 public static void setDbIpAdress(String dbIpAdress) {
  DbIpAdress = dbIpAdress;
 }
 public static String getDbPort() {
  return DbPort;
 }
 public static void setDbPort(String dbPort) {
  DbPort = dbPort;
 }
 public static String getDbName() {
  return DbName;
 }
 public static void setDbName(String dbName) {
  DbName = dbName;
 }
 public static String getDbUser() {
  return DbUser;
 }
 public static void setDbUser(String dbUser) {
  DbUser = dbUser;
 }
 public static String getDbUserPasswd() {
  return DbUserPasswd;
 }
 public static void setDbUserPasswd(String dbUserPasswd) {
  DbUserPasswd = dbUserPasswd;
 }
 public void updateGUI() {
  lbl_DBname = new JLabel(DbName);
  lbl_DBname.setForeground(Color.BLACK);
  lbl_PWD = new JLabel("Password vorgewählt");
  lbl_PWD.setForeground(Color.BLACK);
 }
}

Java:
package formulare;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import mainprog.WvS_ProjectDB;
public class Logindata_dialog extends JDialog {
 
 private static final long serialVersionUID = -8298102570486583361L;
 private final JPanel contentPanel = new JPanel();
 private JTextField text_dbHost;
 private JTextField text_dbPort;
 private JTextField text_dbDatabank;
 private JTextField text_dbUser;
 private JPasswordField pwd_dbPassword;

 public static void main(String[] args) {
  try {
   Logindata_dialog dialog = new Logindata_dialog();
   dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
   dialog.setVisible(true);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 public Logindata_dialog() {
  setBounds(100, 100, 450, 300);
  getContentPane().setLayout(new BorderLayout());
  contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
  getContentPane().add(contentPanel, BorderLayout.CENTER);
  contentPanel.setLayout(null);
  
  JLabel lblHost = new JLabel("Host");
  lblHost.setBounds(15, 16, 69, 20);
  contentPanel.add(lblHost);
  
  JLabel lblPort = new JLabel("Port");
  lblPort.setBounds(15, 52, 69, 20);
  contentPanel.add(lblPort);
  
  JLabel lblDatenbank = new JLabel("Datenbank");
  lblDatenbank.setBounds(15, 88, 123, 20);
  contentPanel.add(lblDatenbank);
  
  JLabel lblUser = new JLabel("User");
  lblUser.setBounds(15, 124, 69, 20);
  contentPanel.add(lblUser);
  
  JLabel lblPassword = new JLabel("Password");
  lblPassword.setBounds(15, 160, 69, 20);
  contentPanel.add(lblPassword);
  
  text_dbHost = new JTextField();
  text_dbHost.setHorizontalAlignment(SwingConstants.RIGHT);
  text_dbHost.setText("localhost");
  text_dbHost.setBounds(125, 13, 288, 26);
  contentPanel.add(text_dbHost);
  text_dbHost.setColumns(10);
  
  text_dbPort = new JTextField();
  text_dbPort.setHorizontalAlignment(SwingConstants.RIGHT);
  text_dbPort.setText("3306");
  text_dbPort.setBounds(125, 49, 288, 26);
  contentPanel.add(text_dbPort);
  text_dbPort.setColumns(10);
  
  text_dbDatabank = new JTextField();
  text_dbDatabank.setHorizontalAlignment(SwingConstants.RIGHT);
  text_dbDatabank.setText("wvs_db");
  text_dbDatabank.setBounds(125, 85, 288, 26);
  contentPanel.add(text_dbDatabank);
  text_dbDatabank.setColumns(10);
  
  text_dbUser = new JTextField();
  text_dbUser.setHorizontalAlignment(SwingConstants.RIGHT);
  text_dbUser.setText("root");
  text_dbUser.setBounds(125, 121, 288, 26);
  contentPanel.add(text_dbUser);
  text_dbUser.setColumns(10);
  
  pwd_dbPassword = new JPasswordField();
  pwd_dbPassword.setHorizontalAlignment(SwingConstants.RIGHT);
  pwd_dbPassword.setBounds(125, 157, 288, 26);
  contentPanel.add(pwd_dbPassword);
  {
   JPanel buttonPane = new JPanel();
   buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
   getContentPane().add(buttonPane, BorderLayout.SOUTH);
   {
    JButton okButton = new JButton("OK");
    okButton.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent arg0) {  
      WvS_ProjectDB.setDbIpAdress(text_dbDatabank.getText()); 
      WvS_ProjectDB.setDbPort(text_dbPort.getText()); 
      WvS_ProjectDB.setDbName(text_dbDatabank.getText()); 
      WvS_ProjectDB.setDbUser(text_dbUser.getText()); 
      char[] zeichen = pwd_dbPassword.getPassword();
      String pwd_abfrage = new String(zeichen);
      WvS_ProjectDB.setDbUserPasswd(pwd_abfrage); 
      Logindata_dialog.this.dispose(); 
     }
    });
    okButton.setActionCommand("OK");
    buttonPane.add(okButton);
    getRootPane().setDefaultButton(okButton);
   }
   {
    JButton cancelButton = new JButton("Cancel");
    cancelButton.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent arg0) {
      Logindata_dialog.this.dispose();
      WvS_ProjectDB.updateGUI();
     }
    });
    cancelButton.setActionCommand("Cancel");
    buttonPane.add(cancelButton);
   }
  }
 }
}
 

Enceladus271

Bekanntes Mitglied
Der Aufruf <Klassenname>.<Methodenname> geht nur bei static Methoden.

Du könntest deinem Dialog im Konstuktor die Instanz übergeben bei der updateGUI aufgerufen werden soll:
Java:
public Logindata_dialog(final WvS_ProjectDB frame)
// ...
frame.updateGUI();

Eine andere Möglichkeit wäre, dass sich der Dialog einfach merkt ob der Benutzer auf Abbrechen oder OK geklickt hat. Wenn in der Klasse WvS_ProjectDB der Dialog dann aufgerufen wurde, kannst du den Dialog abfragen was der Benutzer gemacht hat und dann ggf. updateGUI() aufrufen.

BTW: Die Methode updateGUI macht so keinen Sinn. Du erzeugst neue Label welche aber nirgends verwendet werden. Ich denke mal dass du die vorhandenen Labels nur aktualisieren willst. Das solltest du dann so machen:
Java:
lbl_DBname.setText( DbName );
lbl_DBname.setForeground( Color.BLACK );
 

DerSchlangen

Mitglied
Danke für deine Antwort und Entschuldigung das meine Antwort hat auf sich warten lassen.

Ich habe mir meinen Beitrag nochmal durchgelesen und wollte quasi noch im Nachgang mal den Sinn ergänzen: Im Dialog wird ein Password eingegeben und diverse andere Daten die für den Login wichtig sind. Nach Eingabe im Loginfenster würde ich gerne im Hauptfenster zwei Texte anpassen um zu zeigen das Logindaten hinterlegt sind.
Kannst du mir bitte genau die wirkweise dieser Instanzübergabe erklären? Gebe ich salop gesagt dem Dialogfenster einen Zugang zu den Sachen die in der Hauptkasse/Objekt geschehen?

Ich habe deine Änderungen Eingefügt jetzt sagt mir Eclipse in Zeile 32
Java:
Logindata_dialog Dialog = new Logindata_dialog();
aber einen Fehler. Leider habe ich jetzt gar keine Ahnung mehr weil ich deinen Vorschritt nicht ganz verstanden habe.
 
Zuletzt bearbeitet:

top_chief

Mitglied
Hallo,
vorweg: ich persönlich halte nicht viel von static Methoden (jedenfalls pauschal meine Meinung, gibt Ausnahmen, wie zB "Helper"-Methoden). Grund ist, dass du Zustände über weite Teiler deiner App speicherst und ggf. Logik-Fehler entstehen, ggf. noch Memoryleaks entstehen (jedenfalls unter Android möglich).
Zu deinem aktuellen Problem wäre meine Idee:
1. Lege eine Klasse "LoginData" oä an. Diese Klasse erhält als Member alle Daten, die du für den Login brauchst bzw. speichern möchtest.
2. Erstelle in deiner Main ein LoginData-Objekt, sinnvollerweise so dass der eigentliche Login Dialog ein gefülltes LoginData-Objekt zurückgibt.
möglicher Code: LoginData loginData = showLoginDialog();

Wenn nun die LoginData Methoden wie getPassword(), getLoginTime() etc enthält kannst du deine GUI in der Main mit Hilfe dieser Instanz sauber füllen.
 

Enceladus271

Bekanntes Mitglied
Du hast ja den Konstruktor angepasst, somit musst du natürlich auch die Aufrufe des Konstruktors anpassen. Er erwartet jetzt eine Instanz der Klasse WvS_ProjectDB.

In der WvS_ProjectDB musst du den Dialog im Konstruktor erzeugen:
Java:
public class WvS_ProjectDB extends JFrame {

Logindata_dialog dialog;

public WvS_ProjectDB() {
  // ...
  dialog = new Logindata_dialog(this);
}

}

In der main Methode der Dialog-Klasse musst du den Konstruktor auch anpassen. Du musst erst eine Instanz von WvS_ProjectDB erzeugen und diese dem Dialog-Konstuktor übergeben. Ich denke aber die main hast du nur zum Testen verwendet.

Und zur ersten Frage: Es kann ja mehrere Instanzen der Klasse WvS_ProjectDB geben. Im Code den du ganz oben gepostet hast, weiß der Dialog ja überhaupt nicht bei welcher Instanz er die GUI updaten soll. Also musst du dies dem Dialog mitteilen, indem du die Instanz im Konstuktor übergibst. Also quasi wie du es ausgedrückt hast: er bekommt einen Zugang zu der Instanz.
 

DerSchlangen

Mitglied
Hallo und Danke,
verstehe ich den Mechanismus richtig das ich in der Erstellung des WvS_ProjectDB Objekt quasi das Objekt des Dialogs miterstelle und sie so verbunden sind? Ich habe die von dir vorgeschlagenen Änderungen eingetragen habe jedoch zwei Fragen:
Warum hat Eclipse in Zeile 35 ein Null eingetragen? Und Warum kann ich UpdateGUI nicht mehr aufrufen? Eclipse zeigt dort einen Fehler und der Funktionstest zeigt auch das es nicht klappt.

Hier der Code
Java:
package formulare;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import mainprog.WvS_ProjectDB;
public class Logindata_dialog extends JDialog {
 
 private static final long serialVersionUID = -8298102570486583361L;
 private final JPanel contentPanel = new JPanel();
 private JTextField text_dbHost;
 private JTextField text_dbPort;
 private JTextField text_dbDatabank;
 private JTextField text_dbUser;
 private JPasswordField pwd_dbPassword;

 public static void main(String[] args) {
  try {
   Logindata_dialog dialog = new Logindata_dialog(null);
   dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
   dialog.setVisible(true);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 public Logindata_dialog(final WvS_ProjectDB frame) {
  setBounds(100, 100, 450, 300);
  getContentPane().setLayout(new BorderLayout());
  contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
  getContentPane().add(contentPanel, BorderLayout.CENTER);
  contentPanel.setLayout(null);
  
  JLabel lblHost = new JLabel("Host");
  lblHost.setBounds(15, 16, 69, 20);
  contentPanel.add(lblHost);
  
  JLabel lblPort = new JLabel("Port");
  lblPort.setBounds(15, 52, 69, 20);
  contentPanel.add(lblPort);
  
  JLabel lblDatenbank = new JLabel("Datenbank");
  lblDatenbank.setBounds(15, 88, 123, 20);
  contentPanel.add(lblDatenbank);
  
  JLabel lblUser = new JLabel("User");
  lblUser.setBounds(15, 124, 69, 20);
  contentPanel.add(lblUser);
  
  JLabel lblPassword = new JLabel("Password");
  lblPassword.setBounds(15, 160, 69, 20);
  contentPanel.add(lblPassword);
  
  text_dbHost = new JTextField();
  text_dbHost.setHorizontalAlignment(SwingConstants.RIGHT);
  text_dbHost.setText("localhost");
  text_dbHost.setBounds(125, 13, 288, 26);
  contentPanel.add(text_dbHost);
  text_dbHost.setColumns(10);
  
  text_dbPort = new JTextField();
  text_dbPort.setHorizontalAlignment(SwingConstants.RIGHT);
  text_dbPort.setText("3306");
  text_dbPort.setBounds(125, 49, 288, 26);
  contentPanel.add(text_dbPort);
  text_dbPort.setColumns(10);
  
  text_dbDatabank = new JTextField();
  text_dbDatabank.setHorizontalAlignment(SwingConstants.RIGHT);
  text_dbDatabank.setText("wvs_db");
  text_dbDatabank.setBounds(125, 85, 288, 26);
  contentPanel.add(text_dbDatabank);
  text_dbDatabank.setColumns(10);
  
  text_dbUser = new JTextField();
  text_dbUser.setHorizontalAlignment(SwingConstants.RIGHT);
  text_dbUser.setText("root");
  text_dbUser.setBounds(125, 121, 288, 26);
  contentPanel.add(text_dbUser);
  text_dbUser.setColumns(10);
  
  pwd_dbPassword = new JPasswordField();
  pwd_dbPassword.setHorizontalAlignment(SwingConstants.RIGHT);
  pwd_dbPassword.setBounds(125, 157, 288, 26);
  contentPanel.add(pwd_dbPassword);
  {
   JPanel buttonPane = new JPanel();
   buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
   getContentPane().add(buttonPane, BorderLayout.SOUTH);
   {
    JButton okButton = new JButton("OK");
    okButton.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent arg0) {  
      WvS_ProjectDB.setDbIpAdress(text_dbDatabank.getText()); 
      WvS_ProjectDB.setDbPort(text_dbPort.getText()); 
      WvS_ProjectDB.setDbName(text_dbDatabank.getText()); 
      WvS_ProjectDB.setDbUser(text_dbUser.getText()); 
      char[] zeichen = pwd_dbPassword.getPassword();
      String pwd_abfrage = new String(zeichen);
      WvS_ProjectDB.setDbUserPasswd(pwd_abfrage); 
      Logindata_dialog.this.dispose(); 
     }
    });
    okButton.setActionCommand("OK");
    buttonPane.add(okButton);
    getRootPane().setDefaultButton(okButton);
   }
   {
    JButton cancelButton = new JButton("Cancel");
    cancelButton.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent arg0) {
      Logindata_dialog.this.dispose();
      WvS_ProjectDB.updateGUI();
     }
    });
    cancelButton.setActionCommand("Cancel");
    buttonPane.add(cancelButton);
   }
  }
 }
}
Java:
package mainprog;
import formulare.Logindata_dialog;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import java.awt.Font;
import javax.swing.JButton;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class WvS_ProjectDB extends JFrame {
 private static final long serialVersionUID = 6049042076699458303L;
 private JPanel contentPane;
 private static String DbIpAdress;
 private static String DbPort;
 private static String DbName;
 private static String DbUser;
 private static String DbUserPasswd;
 private JLabel lbl_DBname;
 private JLabel lbl_PWD;
 Logindata_dialog dialog;
 
 
 
 
 public static void main(String[] args) {
  EventQueue.invokeLater(new Runnable() {
   public void run() {
    try {
     WvS_ProjectDB frame = new WvS_ProjectDB();
     frame.setVisible(true);
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  });
 }
 public WvS_ProjectDB() {
  dialog = new Logindata_dialog(this);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setBounds(100, 100, 852, 629);
  contentPane = new JPanel();
  contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
  setContentPane(contentPane);
  contentPane.setLayout(null);
  
  JLabel lbl_Titel = new JLabel("WvS Techniker Projekt Datenbank");
  lbl_Titel.setHorizontalAlignment(SwingConstants.CENTER);
  lbl_Titel.setFont(new Font("Tahoma", Font.BOLD | Font.ITALIC, 30));
  lbl_Titel.setBounds(15, 16, 800, 81);
  contentPane.add(lbl_Titel);
  
  lbl_DBname = new JLabel("Keine Datenbank vorgew\u00E4hlt!");
  lbl_DBname.setFont(new Font("Tahoma", Font.BOLD, 16));
  lbl_DBname.setForeground(Color.RED);
  lbl_DBname.setBounds(15, 148, 272, 20);
  contentPane.add(lbl_DBname);
  
  lbl_PWD = new JLabel("Kein Password eingegeben!");
  lbl_PWD.setFont(new Font("Tahoma", Font.BOLD, 16));
  lbl_PWD.setForeground(Color.RED);
  lbl_PWD.setBounds(15, 187, 244, 20);
  contentPane.add(lbl_PWD);
  
  JButton btn_login = new JButton("Logindaten eingeben");
  btn_login.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent arg0) {
    dialog.setVisible(true);
   }
  });
  btn_login.setBounds(25, 225, 233, 29);
  contentPane.add(btn_login);
 }
 public static String getDbIpAdress() {
  return DbIpAdress;
 }
 public static void setDbIpAdress(String dbIpAdress) {
  DbIpAdress = dbIpAdress;
 }
 public static String getDbPort() {
  return DbPort;
 }
 public static void setDbPort(String dbPort) {
  DbPort = dbPort;
 }
 public static String getDbName() {
  return DbName;
 }
 public static void setDbName(String dbName) {
  DbName = dbName;
 }
 public static String getDbUser() {
  return DbUser;
 }
 public static void setDbUser(String dbUser) {
  DbUser = dbUser;
 }
 public static String getDbUserPasswd() {
  return DbUserPasswd;
 }
 public static void setDbUserPasswd(String dbUserPasswd) {
  DbUserPasswd = dbUserPasswd;
 }
 public void updateGUI() {
  lbl_DBname.setText(DbName);
  lbl_DBname.setForeground(Color.BLACK);
  lbl_PWD.setText("Password vorgewählt");
  lbl_PWD.setForeground(Color.BLACK);
 }
}
 

Enceladus271

Bekanntes Mitglied
Wenn Eclipse das eingetragen hat, hast du wahrscheinlich die Refactoring Mechanik von Eclipse benutzt. In der Dialog Klasse gibt es ja keinen Standardkonstuktor mehr (Standardkonstuktor = Konstruktor ohne Argument). Daher hat Eclipse dort einfach null eingetragen.

Dort musst du jetzt auch frame.updateGUI() aufrufen. Wie schon erwähnt funktioniert <Klassenname>.<Methodenname> nur bei static Methoden. updateGUI() kann also nicht bei der Klasse sondern nur bei einer Instanz der Klasse aufgerufen werden. Deshalb hast du ja die Instanz im Konstuktor übergeben.

Ich habe mir mal den ganzen Code noch mal angesehen. top_chief hat schon recht, dass du zuviel mit static arbeitest. Wahrscheinlich weil du das gleiche Problem hattest wie hier mit der updateGUI Methode. Du solltest dir nochmal klar machen was genau der Unterschied zwischen static und nicht-static ist. Und der Unterschied zwischen einer Klasse und einem Objekt/einer Instanz.
 

DerSchlangen

Mitglied
Hallo,
Also die Static Methoden hat Ellipse als seter & fetter eingefügt. Abgesehen davon kenne ich die auch nur so. Was ist den genau der Nachteil daran? Welche andere Möglichkeit habe ich sonst Daten aus der Eingabe zu übergeben?
Übrigens habe ich weiter versucht konnte aber bis jetzt das Label immer noch nicht ändern. Jetzt bin ich auch am Ende und verstehe das alles auch nicht so ganz. Habt ihr ein kurzes Codebeispiel an den ihr mir das erklären könnt?
 

Enceladus271

Bekanntes Mitglied
Eine Variable die static ist, bezieht sich immer auf die Klasse. D.h. diese Variable existiert immer nur einmal und ist nicht an irgendeine Instanz gebunden. Daher kann man static Methoden auch direkt bei der Klasse aufrufen.

Wenn man eine Variable nicht als static deklariert, so existiert diese Variable für jedes Objekt und kann für jedes Objekt unterschiedliche Werte haben.

Bei einer Klasse Konto kann z.B. die Variable "umrechungsFaktorEuroDollar" static sein, da sie für alle Konten gleich ist, also nur einmal existiert. Aber die Variable "kontoStand" darf nicht static sein, da die Objekte dieser Klasse unterschiedliche Kontostände haben können.

In deinem Code hast du ein Label das nicht static ist. D.h. jedes WvS_ProjectDB Objekt das du erzeugst hat ein eigenes Label. Das ist auch richtig so. Wenn du aber den Text in diesem Label über einen String setzt der static ist, so wirkt sich eine Änderung des Strings auf alle anderen Objekte der Klasse WvS_ProjectDB aus.

Im folgenden Beispiel wird der Text von Label1 über einen static String gesetzt, der von label2 über einen nicht-static String. Wenn du den static String bei Panel1 änderst, ändert sich automatisch auch Panel2:
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;

public class TestPanel extends JPanel {

    private static String    staticLabelText    = "Label 1";
    private String             labelText              = "Label 2";

    private final JLabel    label1;
    private final JLabel    label2;

    public TestPanel() {
        super();

        label1 = new JLabel( staticLabelText );
        label2 = new JLabel( labelText );

        add( label1 );
        add( label2 );

        new Timer( 500, new ActionListener() {

            @Override
            public void actionPerformed( ActionEvent e ) {
                label1.setText( staticLabelText );
                label2.setText( labelText );
            }
        } ).start();
    }

    public void setLabelText( String text ) {
        labelText = text;
    }

    public void setStaticLabelText( String text ) {
        staticLabelText = text;
    }

}

Java:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class StaticTest {

    public static void main( String[] args ) {
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.setLayout( new GridLayout( 2, 2 ) );

        final TestPanel testPanel1 = new TestPanel();
        testPanel1.setBorder( BorderFactory.createTitledBorder( "Panel 1" ) );

        final TestPanel testPanel2 = new TestPanel();
        testPanel2.setBorder( BorderFactory.createTitledBorder( "Panel 2" ) );

        final JButton button1 = new JButton( "Static Text in P1 setzen" );
        button1.addActionListener( new ActionListener() {

            @Override
            public void actionPerformed( ActionEvent arg0 ) {
                final String input = JOptionPane.showInputDialog( frame, "Neuer Text:", "", JOptionPane.INFORMATION_MESSAGE );
                if ( input != null ) {
                    testPanel1.setStaticLabelText( input );
                }
            }
        } );

        final JButton button2 = new JButton( "Normalen Text in P1 setzen" );
        button2.addActionListener( new ActionListener() {

            @Override
            public void actionPerformed( ActionEvent arg0 ) {
                final String input = JOptionPane.showInputDialog( frame, "Neuer Text:", "", JOptionPane.INFORMATION_MESSAGE );
                if ( input != null ) {
                    testPanel1.setLabelText( input );
                }
            }
        } );

        frame.add( testPanel1 );
        frame.add( testPanel2 );
        frame.add( button1 );
        frame.add( button2 );
        frame.pack();
        frame.setVisible( true );
    }
}

Außer die main Methoden und die serialVersionUID sollte eigentlich in deinem Code nichts static sein.

PS: In deinem letzten Code setzt du beim Klick auf Abbrechen die Strings ohne die Labels zu aktualisieren. Beim Klick auf OK aktualisierst du die Labels, hast aber die Strings nicht gesetzt.
 

Harry Kane

Top Contributor
@TS
An deinem Code könnte man noch einiges verbessern. Ich denke aber, dass du zuallererst verstehen musst, wie man in deinem Fall das static loswird.
Du übergibst zwar an deine Login_Data Klasse eine Instanz von WvS_ProjectDB, verwendest sie aber gar nicht. Deshalb machts es auch nichts, wenn du null übergibst.
Um mit möglichst wenig Änderungen am Code zum Ziel zu kommen, mache folgendes:
- Lege in deiner Login_Data eine private (nicht-stattsche) Variable vom Typ WvS_ProjectDB mit dem Namen frame an.
private WvS_ProjectDB frame:
- weise dieser Variablen den Wert zu, den du im Konstruktor von Login_Data übergibst:
this.frame = frame
- Ersetze in den ActionListenern WvS_ProjectDB durch frame. Dann kannst du auch updateGUI aufrufen.

Meiner Meinung verwendest du den Logindialog falsch. Anstatt zu Beginn je eine Instanz von WvS_ProjectDB und Login_Data anzulegen, könntest du einfach bei Bedarf mit einer Funktion in deiner WvS_ProjectDB-Klasse einen Dialog einblenden, die dort eingegebene Werte von WvS_ProjectDB-Klasse auslesen lassen und damit die GUI Elemente von WvS_ProjectDB aktualisieren. Du siehst ja selber, zu welch komplexem Code dein aktueller Ansatz bei nur einem Dialog führt. Wenn dioe Anzahl der Dialog zu jnimmt, wird das ganze sehr schnell unübersichtlich.

Hier mal ein Beispiel, wie ein nur bei Bedarf eingeblendeter Dialog verwendet werden kann. Auf das Erweitern von JDialog wurde dabei verzichtet, und die Sonderfunktionalität über ein erweitertes JPanel erzielt:
Java:
public class Personenverwaltung {

    public static void main(String[] args) {
        JFrame frame = new JFrame("Personenverwaltung");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JButton showDialog = new JButton("Dialog anzeigen");
        frame.getContentPane().add(showDialog);
        showDialog.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                JDialog dlg = new JDialog();
                PersonenPanel pp = new PersonenPanel();
                dlg.setContentPane(pp);
                dlg.pack();
                dlg.setModal(true);
                dlg.setVisible(true);
                System.out.println(pp.getPerson());
            }
        }
        );
        frame.pack();
        frame.setVisible(true);

    }

    static class PersonenPanel extends JPanel{

        private JTextField vornameFeld = new JTextField(20);
        private JTextField nachnameFeld = new JTextField(20);

        public PersonenPanel() {
            super(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            add(new JLabel("Vorname"), gbc);
            gbc.gridx = 1;
            add(vornameFeld, gbc);
            gbc.gridx = 0;
            gbc.gridy = 1;
            add(new JLabel("Nachname"), gbc);
            gbc.gridx = 1;
            add(nachnameFeld, gbc);
        }

        public Person getPerson() {
            return new Person(vornameFeld.getText(), nachnameFeld.getText());
        }
    }

    static class Person {

        private String vorname;
        private String nachname;

        public Person(String vorname, String nachname) {
            this.vorname = vorname;
            this.nachname = nachname;
        }

        public String getVorname() {
            return this.vorname;
        }

        public String getNachname() {
            return this.nachname;
        }

        public String toString() {
            return nachname + ", " + vorname;
        }
    }
}
 

top_chief

Mitglied
Bei einer Klasse Konto kann z.B. die Variable "umrechungsFaktorEuroDollar" static sein, da sie für alle Konten gleich ist, also nur einmal existiert. Aber die Variable "kontoStand" darf nicht static sein, da die Objekte dieser Klasse unterschiedliche Kontostände haben können.

Super erklärt, das Beispiel werde ich mir merken :)

Auch wenn es vielleicht hier nur bedingt reingehört.. Die Aussage, dass static nur "eigentlich nur die main und die serialVersionUID sein sollten" ist meiner Meinung nach ein zweischneidiges Schwert. In JavaFX gibt es eine Vielzahl an Objekten, die via static aufrufbar sind.
https://docs.oracle.com/javase/8/javafx/api/javafx/fxml/doc-files/introduction_to_fxml.html#static_property_elements
Sinn dahinter ist es den Code leichter lesbar zu machen, beispielsweise um Helfer-Methoden erreichen zu können.

Static ist "böse" weil es in gewisser Weise gegen die OOP verstößt ("Objekte dynamisch, mehrfach erstellen") aber trotzdem gibt es an speziellen Stellen sinnvolle Möglichkeiten Variablen bzw. Methoden als "einmalig" kennzeichnen zu können.
 

Enceladus271

Bekanntes Mitglied
Ich habe ja auch geschrieben "sollte eigentlich in deinem Code nichts static sein". Gemeint war damit der Code den DerSchlangen hier gepostet hat.

Es war damit nicht gemeint, dass static generell nicht verwendet werden sollte. Es gibt ja auch in Java SE genügend Beispiele für static Konstanten oder Helper Klassen mit static Methoden die sehr sinnvoll sind.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Jose05 JavaFx Fxml: GUI aus einer anderen Klasse starten AWT, Swing, JavaFX & SWT 1
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
karlmasutra JavaFX Zugriff auf eine erzeugte Scene aus einer anderen Klasse AWT, Swing, JavaFX & SWT 1
L Java- UI zweites Fenster aus einer anderen Klasse öffnen durch ButtonClick AWT, Swing, JavaFX & SWT 4
J JFram Location aus Konstruktor einer anderen Klasse auslesen AWT, Swing, JavaFX & SWT 10
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
B Swing Auf JList-Elemente aus einer anderen Klasse zugreifen AWT, Swing, JavaFX & SWT 1
N JavaFX GUI Elemente einer anderen (FXML)Klasse ansprechen AWT, Swing, JavaFX & SWT 16
B Swing GUI in einer anderen Klasse aufrufen AWT, Swing, JavaFX & SWT 4
F Instanzierung einer inneren Klasse in Klasse eines anderen Packets AWT, Swing, JavaFX & SWT 3
C JavaFX Zugriff auf TextField aus einer anderen Klasse AWT, Swing, JavaFX & SWT 4
V kann ich in einer Klasse stage und scene deklarieren, aber in anderen Klassen Inhalte hinzufügen ? AWT, Swing, JavaFX & SWT 5
W JavaFX Label in Controller-Klasse in einer anderen Controller-Klasse ändern AWT, Swing, JavaFX & SWT 9
M Gui in einer anderen Java Klasse aufrufen AWT, Swing, JavaFX & SWT 1
D Nächste GUI in einer anderen Klasse aufrufen AWT, Swing, JavaFX & SWT 7
Z Swing Text aus JTextField einer anderen Klasse AWT, Swing, JavaFX & SWT 14
A AWT Auto aus einer anderen Klasse her neu zeichnen AWT, Swing, JavaFX & SWT 7
S Von einer anderen Klasse auf JTextField zugreifen AWT, Swing, JavaFX & SWT 13
P Von einer anderen Klasse auf JTextField zugreifen AWT, Swing, JavaFX & SWT 12
S Swing mit ActionListener auf Objekte einer anderen Klasse zugreifen AWT, Swing, JavaFX & SWT 3
D Paint() Methode aus einer anderen Klasse aufrufen AWT, Swing, JavaFX & SWT 6
E JFrame Componente aus einer anderen klasse disposen AWT, Swing, JavaFX & SWT 3
N Image Array einer anderen Klasse bearbeiten AWT, Swing, JavaFX & SWT 2
F JTextArea aus einer anderen Klasse heraus verändern AWT, Swing, JavaFX & SWT 4
W Methodenaufruf aus einer anderen Klasse AWT, Swing, JavaFX & SWT 3
G layout in einer anderen klasse AWT, Swing, JavaFX & SWT 4
M Abfragen von Buttons in einem Panel einer anderen Klasse AWT, Swing, JavaFX & SWT 4
A checkbox in einer TableView abhängig von einem anderen Celleninhalt disablen AWT, Swing, JavaFX & SWT 1
J Compiler in der JavaFX stop() Methode warten lassen bist eine Aktion in einer anderen Scene gemacht AWT, Swing, JavaFX & SWT 5
D [Anfänger]ComboBox erstellt Einträge in einer anderen ComboBox AWT, Swing, JavaFX & SWT 3
K Kann nicht auf GUI Elemente zugreifen, mit einer Methode im Controller klappts, mit der anderen nich AWT, Swing, JavaFX & SWT 10
Z JavaFX Inhalt einer ViewTable durch Aktion einer Menubar ändern welche in einer anderen fxml ist AWT, Swing, JavaFX & SWT 4
K Array von einer Action zur anderen bringen AWT, Swing, JavaFX & SWT 7
E Mit Netbeans von einer Form auf eine Komponente einer anderen Form zugreifen AWT, Swing, JavaFX & SWT 2
I Wie mehrere JComboBoxen in Abhängigkeit einer anderen Box ändern? AWT, Swing, JavaFX & SWT 8
D JComboBox jedes Item mit einer anderen Farbe AWT, Swing, JavaFX & SWT 10
S Class in einer anderen Class ausführen? AWT, Swing, JavaFX & SWT 5
G Auf markierten Text einer anderen Anwendung zugreifen. AWT, Swing, JavaFX & SWT 8
G Komponenten einer Java-App von einer anderen auslesen AWT, Swing, JavaFX & SWT 9
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
T VerifyListener - Ersetzen einer 0 AWT, Swing, JavaFX & SWT 5
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
N Dropshadow setzen bei einer Gruppe von Tiles, die sich jeweils in einer Stackpane befinden, welche in einer Gridpane angeordnet sind. AWT, Swing, JavaFX & SWT 0
M Daten zufällig Einlesen aus einer Datei (binäres Format) AWT, Swing, JavaFX & SWT 7
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
Linjutsu Den Inhalten aus einer ArrayList Bilder zuweisen (Kartenspiel) AWT, Swing, JavaFX & SWT 8
H JavaFX Timeline II: Verschieben einer ImageView AWT, Swing, JavaFX & SWT 16
I Hilfe bei dem Erstellen einer SQL Abfrage aus gewählten JComboBoxen AWT, Swing, JavaFX & SWT 5
L Swing TextPanel Schrift untereinander und auf einer Höhe AWT, Swing, JavaFX & SWT 3
mananana Mögliche probleme die in einer GUI passieren Können AWT, Swing, JavaFX & SWT 6
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
melaniemueller Wortliste in einer Datei ablegen AWT, Swing, JavaFX & SWT 12
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
U Was genau ist das Objekt einer affinentransformation? AWT, Swing, JavaFX & SWT 1
B JavaFX Prüfen ob ein Objekt sich mehrmals in einer Liste befindet AWT, Swing, JavaFX & SWT 5
mac2010 JavaFX Einbindung einer Karte AWT, Swing, JavaFX & SWT 1
donnico2 Objekte in der GUI ausgeben mit Hilfe einer DAO AWT, Swing, JavaFX & SWT 1
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
W Aufrufen einer bestimmten Scene mit if-Bedingung AWT, Swing, JavaFX & SWT 4
J Ablaufsteuerung/Anleitung machen mit JDialog und einer Zustandsmaschine AWT, Swing, JavaFX & SWT 1
missy72 JavaFX Wiederholen einer IF-Abfrage beim erneuten Öffnen einer Stage AWT, Swing, JavaFX & SWT 11
missy72 JavaFX TableView / TableColumn / ObservableList / zwei Werte in einer Zelle AWT, Swing, JavaFX & SWT 2
S JavaFX - mit Listener Veränderungen in einer TableView abhören AWT, Swing, JavaFX & SWT 3
missy72 JavaFX ObservableList in einer ArrayList speichern. AWT, Swing, JavaFX & SWT 7
HoT Sortieren von ein paar Zeilen in einer Tabelle, aber nicht die ganze Tabelle AWT, Swing, JavaFX & SWT 3
kodela Swing Element einer JComboBox ausgrauen AWT, Swing, JavaFX & SWT 3
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
H Daten aus einer XML(x83-Datei) in einem JFrame anzeigen lassen AWT, Swing, JavaFX & SWT 9
N Einer TextArea ein ScrollPane hinzufügen AWT, Swing, JavaFX & SWT 8
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1
K Probleme bei der Erstellung und Ausführung einer Jar Datei AWT, Swing, JavaFX & SWT 2
G Verknüpfung einer pdf Datei AWT, Swing, JavaFX & SWT 2
B Ausgaben einer Umrechnung vom Textfeld in ein Label AWT, Swing, JavaFX & SWT 2
F jTree und das Model aus einer eigenen Klasse AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
N Wie kann ich zwei Grafiken in einer Oberfläche anzeigen lassen? AWT, Swing, JavaFX & SWT 8
@SupressWarnings() JavaFX Auf den Controller einer ListCell zugreifen AWT, Swing, JavaFX & SWT 4
Drachenbauer Swing Wie ändere ich den Hintergrund vom Anzeigefeld einer JComboBox, die nicht zum Hineinschreiben offen steht? AWT, Swing, JavaFX & SWT 32
H 3 verschiedene Nachrichten in einer FXML View die Infos kommen aus DB AWT, Swing, JavaFX & SWT 4
S Java GUI durch variable Größe einer Map anpassen AWT, Swing, JavaFX & SWT 3
B Textfelder in einer ListView ausgeben AWT, Swing, JavaFX & SWT 13
J Searchfunktion auf einer MS Access Datenbank AWT, Swing, JavaFX & SWT 7
B Text im Tetfeld in einer TableView darstellen AWT, Swing, JavaFX & SWT 20
M Inhalte einer FlowPane AWT, Swing, JavaFX & SWT 4
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
E Prinzip: wie man Ereignisse in einer GUI verarbeit. Frage zum Design? AWT, Swing, JavaFX & SWT 10
FRI3ND JavaFX: Wie kann ich einer Scene Argumente übergeben? AWT, Swing, JavaFX & SWT 14
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
G JavaFX JavaFX-Dialog aus einer Nicht-JavaFX-Anwendung heraus AWT, Swing, JavaFX & SWT 1
1 Swing Progressbar benutzen um Fortschritt einer Methode anzuzeigen AWT, Swing, JavaFX & SWT 4
K JavaFX ViewTable mit einer LinkedList befüllen AWT, Swing, JavaFX & SWT 3
L CardLayout in einer Klasse? AWT, Swing, JavaFX & SWT 2
D Java FX Image in einer Webanwendung annotieren und den Bereich ausschneiden AWT, Swing, JavaFX & SWT 0
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing Ausführung einer SwingWorker Klasse stoppen AWT, Swing, JavaFX & SWT 4
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben