Stringaufruf aus einer anderen Klasse

quidnovi

Erfahrenes Mitglied
Hi folks :)

folgendes Konstrukt:

CardLayout;
Card1 und Card2 (es gibt natürlich noch weitere);

In Card 1 rufe ich Daten einer DB - Tabelle auf und speichere diese in ein JTable.
Wenn nun auf eine beliebige Zeile in der JTable geklickt wird, dann erscheint der markierte Datensatz in den jeweils dafür vorgesehenen txtFields. Der Datensatz besitzt natürlich eine ID, damit Änderungen... durchführbar sind.

So weit, so gut, funktioniert auch alles.

Nun möchte ich den oben angesprochenen Datensatz in der Card2 anzeigen lassen und das funktioniert nicht.

Card1.java:
Java:
public class Card1 extends JPanel {

	private JButton btnKommCall;
	private String txtFromKlick = null;

	// Konstruktor
	public Card1(ActionListener listener) {
		
		//.....

		// Button Kommission aufrufen
		btnKommCall = new DesignButton("Kommission aufrufen","CARD2", 14, 
				"Markierte Kommission aufrufen", listener);


		// ActionListener - btnKommCall
		btnKommCall.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				txtFromTbl();
				
				if(e.getSource() == btnKommCall){
					// Zur Kontrolle auf der Konsole ausgeben
					System.out.println("Card1: " + txtFromTbl()); // <---- Hier ist das Angeforderte noch da
				} else{
					System.out.println("Mag mich nit");
				}
			}
		});

	  }


	}// Ende Konstrultor

	//------- Abfrage der Datenbank ------

	// Vector fuer die Spaltennamen
	public final static Vector<?> COLUMN_IDENTIFIERS = new Vector<Object>() {

		// serialVersionUID
		private static final long serialVersionUID = 4136566931496300757L;

		{
			add("Id");
			add("Datum");
			add("KommNr");
			add("KommName");
			add("Strasse");
			add("HausNr");
			add("Plz");
			add("Gemeinde");
			add("TelNr");
			add("Bemerkung 1");
			add("Bemerkung 2");
		}
	};

	// --------------------------------------------------------------------------------

	// Vector fur die Daten aus der DB
	protected Vector<Vector<String>> findAllData() {
		DBConnect.connect();
		Vector<Vector<String>> results = new Vector<Vector<String>>();
		try {
			Statement stmt = DBData.connection.createStatement();
			ResultSet rs = stmt.executeQuery("SELECT * FROM KOMMISSIONEN");

			while (rs.next()) {
				Vector<String> row = new Vector<String>();
				row.addElement(rs.getString("ID"));
				row.addElement(rs.getString("DATUM"));
				row.addElement(rs.getString("KOMMNR"));
				row.addElement(rs.getString("KOMMNAME"));
				row.addElement(rs.getString("STRASSE"));
				row.addElement(rs.getString("HAUSNR"));
				row.addElement(rs.getString("PLZ"));
				row.addElement(rs.getString("GEMEINDE"));
				row.addElement(rs.getString("TELNR"));
				row.addElement(rs.getString("BEMERKUNG1"));
				row.addElement(rs.getString("BEMERKUNG2"));
				results.add(row);
			}
			// Resultset schließen
			rs.close();

			// Statement schließen
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return results;
	}

	// ------ Fuellen der Tetxtfelder ----------------------------------------------------------------------

	public void resultInTxtFld() {

		table.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent evt) {

				int row = table.getSelectedRow();
				txtId.setText(table.getModel().getValueAt(row, 0).toString());
				txtDatum.setText(table.getModel().getValueAt(row, 1).toString());
				txtKommNr.setText(table.getModel().getValueAt(row, 2)
						.toString());
				txtKommName.setText(table.getModel().getValueAt(row, 3)
						.toString());
				txtStrasse.setText(table.getModel().getValueAt(row, 4)
						.toString());
				txtHausNr.setText(table.getModel().getValueAt(row, 5)
						.toString());
				txtPlz.setText(table.getModel().getValueAt(row, 6).toString());
				txtGemeinde.setText(table.getModel().getValueAt(row, 7)
						.toString());
				txtTelNr.setText(table.getModel().getValueAt(row, 8).toString());
				txtBem1.setText(table.getModel().getValueAt(row, 9).toString());
				txtBem2.setText(table.getModel().getValueAt(row, 10).toString());
			}
		});

	}

	//------- Text fuer Card2 -----------------------------------------------------------------------
	
	public String txtFromTbl() {
		txtFromKlick = txtBem2.getText();
		//System.out.println("KommList: " + idFromKlick);
		return txtFromKlick;
	}

Card2.java
Java:
public class Card2 extends JPanel {

	//....
	private JTextField textBemerkung2;

	// Konstruktor
	public Card2(ActionListener listener) {

		// Instanz der Klasse Card1 erstellen
		Card1 c1 = new Card1(listener);

		// Textfeld fuellen
		textBemerkung2 = new JTextField();
		textBemerkung2.setText(c1.txtFromTbl()); // <---- Hier ist das Angeforderte NICHT mehr da!! 

		//.......


	}
}

Ich instanziiere die Card1 in Card2, die String Variable idFromKlick ist als Instanzvariable definiert... :confused:
leider gehen hier meine bescheidenen Java - Kenntnisse auch schon zu Ende :(

Ich bitte Euch nun, den Code durchzusehen und mir den Fehler zu nennen.

Danke schonmal im Voraus :)
 
Hi

Irgendwo außerhalb des gezeigten Codes machst du am Anfang ein Card1 und ein Card2
zum Anzeigen. Später machst in Card2 noch ein neues Card1.
Ein Anderes.
Mit eigenen Variablen.
...

Das Card2 muss natürlich das ursprüngliche Card1 kennen, kein genewtes.
Eine Möglichkeit:
Übergib das Card1 bei der Erzeugerstelle dem Konstruktor von Card2.
Sowas (je nachdem, wie und wo erzeugt wird):
Java:
//listener hat mit der Sache hier jetzt nichts zu tun, aber du übergibst ja welche
Card1 c1 = new Card1(listener);
Card1 c2 = new Card2(listener, c1);
Der Konstruktor con Card2 muss natürlich auch angepasst werden:
Java:
public Card2(ActionListener listener, Card1 card1) {
...
}
card1 dann verwenden.

Nur ein gut gemeinter Rat:
Bevor du dich mit GUIs und Datenbanken weiterbeschäftigst,
schau dir die grundlegensten Grundlagen etwas genauer an.

Gruß
 
Hi sheel :)

danke für die Antwort.

Gebe Dir recht, dass mir die Grundlagen noch ziemlich fehlen, nur "schwimme" ich auf der Welle: "lernen am lebenden Projekt".
Abgesehen davon verfalle ich auch dem Wunsch, so schnell wie möglich etwas zu sehen, deshalb der eingeschlagene Weg von mir.

Nun gut...dann werde ich mich eben nochmals in die Theorie versenken *ächz* :p ;)

Werde Deinen Ansatz explizit verfolgen, denn noch kann ich damit recht wenig anfangen...noch ;)

Allerdings möchte ich diesen Thread jetzt noch nicht als "erledigt" markieren, da ich mich baldigst sicher wieder melde.
Hoffentlich mit einer Lösung, sonst eben mit weiteren Fragen.

Danke nochmals :)
 
Habe jetzt folgenden Lösungsversuch...

Erstellte folgende Klasse:
Java:
public class GetCurrentId {
	
	static String currId;

	public static String getCurrId() {
		return currId;
	}

	public static void setCurrId(String currId) {
		GetCurrentId.currId = currId;
		// Zur kontrolle auf der Konsole ausgeben
		System.out.println("Class GetCurrentId: " + currId);
	}

}

Diese Klasse rufe ich dann per Punktnotation in der KommList.java Klasse auf.
Kurze Erklärung:
Habe zum leichteren Verständnis meine Cards für die Frage in diesem Forum hier, mit Card1 und Card2 benannt,
in Wirklichkeit nennen sich diese KommList.java und AuswahlAnzeigen.java.

In der Card KommList.java lasse ich in einem JTable eine DB - Tabelle ausgeben.
Wenn ich nun in eine Zeile der JTable klicke, füllen sich vorbereitete txtFields mit den Daten den Datensatzes,
bezogen auf die ID.
Das schaut folgendermaßen aus:
Java:
public void resultInTxtFld() {

		table.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent evt) {

				int row = table.getSelectedRow();
				txtId.setText(table.getModel().getValueAt(row, 0).toString());
				txtDatum.setText(table.getModel().getValueAt(row, 1).toString());
				txtKommNr.setText(table.getModel().getValueAt(row, 2)
						.toString());
				txtKommName.setText(table.getModel().getValueAt(row, 3)
						.toString());
				txtStrasse.setText(table.getModel().getValueAt(row, 4)
						.toString());
				txtHausNr.setText(table.getModel().getValueAt(row, 5)
						.toString());
				txtPlz.setText(table.getModel().getValueAt(row, 6).toString());
				txtGemeinde.setText(table.getModel().getValueAt(row, 7)
						.toString());
				txtTelNr.setText(table.getModel().getValueAt(row, 8).toString());
				txtBem1.setText(table.getModel().getValueAt(row, 9).toString());
				txtBem2.setText(table.getModel().getValueAt(row, 10).toString());
				
				// Wert fuer Klassenvariable
				GetCurrentId.setCurrId(txtId.getText());
			}
		});

	}
Wie zu sehen ist, rufe ich die GetCurrentId - Klasse auf und übergebe den Parameter txtId.getText.
In der GetCurrentId - Klasse habe ich ein Sysout eingebaut, um zu sehen, ob der Parameter auch angekommen ist.

Ich klickte dann auf den 16. Eintrag in der JTable und erhielt folgendes Ergebnis:
Code:
Class GetCurrentId: 16
Also richtig :)

Nun gelange ich über den JButton "Kommission anzeigen" in der Card KommList.java zur AuswahlAnzeigen.java.

Hier greife ich nun abermals per Punktnotation auf die GetCurrentId.java zu
und möchte die ID in ein dafür vorgesehenes txtField ausgeben.

Das sieht dann so aus:
Java:
textId = new JTextField();
textId.setText(GetCurrentId.getCurrId());

Leider funktioniert das aber nicht - wieso?

Meinem Verständnis nach ist ja der Wert der ID in der GetCurrentId - Klasse gespeichert, also von überall her auch aufrufbar.

Oder verstehe ich da etwas falsch?

Bitte helft mir beim Verständnis, danke :)
 
Zuletzt bearbeitet von einem Moderator:
Bin jetzt gerade etwas verwirrt :rolleyes:
Anderer Anfang:
Was genau funktioniert denn nicht?
Compilerfehler (welcher), oder Programmverhalten...?
 
HiHo :)

ja...verwirren kann ich offenbar - mit der Zeit mich selbst auch ;)

Versuche Unklarheiten zu beseitigen:
Habe mehrere Cards, die momentan wichtigen sind Card "KommList" und Card "AuswahlAnzeigen".

Card KommList.java
Hier sind ein JTable und mehrere Buttons sichtbar.
Im Jtable werden alle Datensätze einer DB - Tabelle namens "Kommissionen" aufgelistet.
Auf Klick in eine JTable - Zeile, werden einzelne Teile des gewählten Datensatzes in txtFields ausgegeben.
Dies ermöglicht das Auslesen des Datensatzes mittels der ID.
Auf dieser Card befindet sich aucxh der JButton "Kommission aufrufen".
Bei Klick auf diesen, gelangt man auf die Card "AuswahlAnzeigen".

Card AuswahlAnzeigen.java
Hier werden nun alle - mit der ausgewählten Kommission zusammenhängenden Daten - ausgegeben.
Auch hier wieder veränder- und löschbar.

Da Bilder mehr als Worte auszudrücken vermögen, habe ich die beiden Cards als Screenshot angehängt.

Zum Auslesen und speichern der ID aus Card KommList, verwende ich die statische Methode GetCurrentId.
Java:
public class GetCurrentId {
	
	static String currId;

	public static String getCurrId() {
		return currId;
	}

	public static void setCurrId(String currId) {
		GetCurrentId.currId = currId;
		// Zur kontrolle auf der Konsole ausgeben
		System.out.println("Class GetCurrentId: " + currId);
	}

}

Die setCurrId - Methode rufe ich in der Card KommList auf, welche die aktuelle ID (Klick auf die JTable - Zeile) übernimmt.
Das funktioniert. Lasse zur Kontrolle die gewählte ID auf der Konsole ausgeben.
Java:
// Hier werden die txtFields mit den einzelnen Daten befuellt
public void resultInTxtFld() {

		table.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent evt) {

				int row = table.getSelectedRow();
				txtId.setText(table.getModel().getValueAt(row, 0).toString());
				txtDatum.setText(table.getModel().getValueAt(row, 1).toString());
				txtKommNr.setText(table.getModel().getValueAt(row, 2)
						.toString());
				txtKommName.setText(table.getModel().getValueAt(row, 3)
						.toString());
				txtStrasse.setText(table.getModel().getValueAt(row, 4)
						.toString());
				txtHausNr.setText(table.getModel().getValueAt(row, 5)
						.toString());
				txtPlz.setText(table.getModel().getValueAt(row, 6).toString());
				txtGemeinde.setText(table.getModel().getValueAt(row, 7)
						.toString());
				txtTelNr.setText(table.getModel().getValueAt(row, 8).toString());
				txtBem1.setText(table.getModel().getValueAt(row, 9).toString());
				txtBem2.setText(table.getModel().getValueAt(row, 10).toString());
				
				
                                // Wert fuer Klassenvariable der statischen Methode übergeben
				GetCurrentId.setCurrId(txtId.getText());
			}
		});

	}
Somit habe ich den gewählten Datensatz zur Verfügung.

Bei Klick auf den JButton "Kommission aufrufen" wird die Card "AuswahlAnzeigen" eingeblendet.
Hier versuche ich mittels der getCurrId - Methode aus GetCurrentId.java, die ID zu benutzen (Benötige ich ja, um alle Daten des Datensatzes aus der DB abzurufen).
Java:
private String printId(){
		String str = GetCurrentId.getCurrId();
		
		// Zur Kontrolle, die ID auf der KOnsole ausgeben
		System.out.println("printId() Methode liefert: " + str);
		return str;
	}

Und genau hier habe ich die ID nicht mehr.

Das ist eigentlich auch nicht verwunderlich, da statisches nur einmal initialisiert wird.
Aus diesem Grund habe ich ja in der Card" Auswahl anzeigen" ein NULL - Ergebnis bei der ID (diese wird ja erst ausgewählt).

Wie schaffe ich es nun die aktuell gewählte ID zu nutzen?
 

Anhänge

  • KommList.png
    KommList.png
    111,6 KB · Aufrufe: 15
  • AuswahlAnzeigen.png
    AuswahlAnzeigen.png
    297,9 KB · Aufrufe: 13
Warum ist es denn notwendig die ausgeählte ID static darzustellen? Komm grad nicht hinter den Sinn dieser Anweisung. Wenn du diese als non static deklarierst sollte der ganze Ablauf doch funktionieren?

um mal aus Galileo zu zitieren : "Statische Variablen werden in erster Linie als Konstanten verwendet."
Das ist ja bei der sich immer wieder ändernden ID nicht der Fall?
 
Zuletzt bearbeitet:
Schönen guten Morgen Ihr alle :)

melde mich jetzt mit der Lösung des Problems :)
Im Prinzip isses ganz einfach - naja...wenn man weiß wie's geht ;)

Wie geschrieben, befülle ich die txtfields mit den Werten aus der DB.
Die einzelnen Werte werden dann über einen JButton - mit welchem die Card AuswahlAnzeigen aufgerufen wird - mitgeschickt.

Sieht in Detail so aus (Button auf Card KommList):
Java:
btnKommCall.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {				
				AuswahlAnzeigen.setId(txtId.getText());
			}
		});

Wie hier zu sehen ist, rufe ich eine Methode aus der Card AuswahlAnzeigen auf.
Java:
public static void setId(String str) {
		txtId.setText(str);
	}

Das txtField txtId wird in der Card AuswahlAnzeigen auf static gesetzt:
Java:
private static JTextField txtId;

Somit wird der Anwender den Datensätzen bezogen auf die ID angesichtig und kann diese dann ändern oder auch löschen.

Die ganze Verwirrung resultiert aus dem Umstand, dass ich die Sprache Java in ihrer Grammatik noch nicht mächtig bin zu sprechen.
Bin aber fleißig beim lernen :)
Und die unschätzbare Hilfe von Hilfsbereiten hier, beschleunigen diesen Effekt ungemein :)

Vielen herzlichen Dank an alle hier :)
 
Zurück