Swing JTextField reagiert nicht auf .setText();

Jigga

Bekanntes Mitglied
Hallo,

also entweder ich steh gerade richtig auf den schlauch, oder ich übersehe etwas.
folgendes problem.ich bastel mir ein Fenster zusammen. dafür erstelle ich zuerst ein JFrame objekt. dieses fülle ich in einer Methode mit den jeweiligen komponenten und lasse es darstellen. zur laufzeit möchte ich nun de Inhalt eines JTExtFields ändern. dazu rufe ich eine Methode in meiner klasse mit einer Variable auf "public void changeTxtFiled(String text) {...}". jedoch passiert nichts!
habe bereits versuch folgedes mit einzubauen
Java:
public void changeTxtField(String text) {
		txtRoom.setText(text);
		framerepaint();
		txtRoom.updateUI();
		System.out.println(text);
	}

hat auch nichts gebracht.das textfeld wird auch vor der eigentlichen GUI Darstellung definiert und wird während der initialisierung des fensters auf txtRoom.setEditable(false) gesetzt
Java:
private JTextField txtRoom = new JTextField(20);


was übersehe ich hier?

EDIT: zuvor habe ich mit einem JFram konstruktor gearbeitet und da ging das problemes:
Java:
public class bspFrame extends JFrame {
public bspFrame() {
...
....
}
}
 
Zuletzt bearbeitet:
hier ist ein Programm mit allen von dir geposteten und halb beschriebenen Code-Zeilen (editable)

Java:
public class TestGUI
    extends JFrame
{
    private JTextField txtRoom = new JTextField(20);

    public TestGUI()
        throws Exception
    {
        txtRoom.setEditable(false);
        add(txtRoom);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500, 300);
        setVisible(true);

    }

    public void changeTxtField(String text)
    {
        txtRoom.setText(text);
        // framerepaint();
        // txtRoom.updateUI();
        System.out.println(text);
    }

    public static void main(String[] args)
        throws Exception
    {
        TestGUI t = new TestGUI();
        
        Thread.sleep(3000);
        t.changeTxtField("aaaa");
    }
}
und es funktioniert, nach 3 sec erscheint "aaaa",
erkennst du wie wenig deine Beschreibungen nützen? es kann alles mögliche schiefgehen wenn du kein vollständiges Programm postest, möglichst klein wie meines,

ein Tipp:
immer nach doppelten Objekten Ausschau halten, wird im Konstruktor doch noch ein zweites Textfeld erstellt, evtl. mit gleichen Variablennamen?
wird die changeTxtField() an einem anderen Objekt mit eigenen zweiten Textfeld (+ alles andere auch doppelt) aufgerufen?
usw.
 
das fenster würde hier leider den rahmen sprengen,da mitlerweil ziehmlich komplex.jedoch hat eclipse diese nette variablen "hervorherb funktion" wenn diese markiert sind. sprich ich habe bereits ausschau nach doppelt erstellten objekten gehalten.die sind nicht vorhanden,gehören eigentlich auch nicht zu meinem stil.
siehe bitte das EDIT,mit der konstruktor variante funktioniert es.sobald ich das Frame vorher selbst definiere funktioniert es nicht mehr.
 
Zuletzt bearbeitet von einem Moderator:
es ist doch ziemlich leicht, in einer GUI alles mögliche zu streichen, einzelne Komponenten, ganze Unterpanel usw.,
pass nur auf dass das Textfeld noch in die GUI kommt, changeTxtField() scheint nicht viel mehr zu brauchen,
framerepaint();ist auch nicht nötig, was immer das ist, keine Listener usw., kann alles weg,

wenn dabei der Fehler verschwindet, tjaja, dann wirds interessanter,
deine Konstruktor-Anmerkung hilft mir leider nicht, den Fehler zu erkennen

edit:
du willst nicht zufällig während einer Aktion, die, von einem ActionListener ohne eigenen Thread gestartet, den AWT-Thread blockiert, einen Status updaten?,
wer genau ruft die Methode unter welchen Umständen auf?
 
Zuletzt bearbeitet von einem Moderator:
ok dann machen wir das ganze interessant 🙂

hier ein kurz geschriebenes beispiel meiner situation,einziger unterschied ist,dass die methode zum ändern des textes von einer andere klasse aufgerufen wird. aber da es bei dieser variante ebenfalls nicht funktioniert sollte das irrelevant sein.

Java:
package gui;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {
	
	
	public JFrame frame = new JFrame();
	private Container pane;
	public JTextField txtRoom = new JTextField(15);
	private JPanel pnlBPNorth = new JPanel();
	private JPanel pnlBP = new JPanel();
	private JTabbedPane tabMain = new JTabbedPane();
	
	public void win() {
		frame.setTitle("Mein Problem");
		frame.setSize(500, 500);
		pane = frame.getContentPane();
		
		txtRoom.setEditable(false);
		pnlBP.setLayout(new BorderLayout());
		pnlBPNorth.setLayout(new FlowLayout());

		pnlBPNorth.add(txtRoom);
		pnlBP.add(pnlBPNorth, BorderLayout.NORTH);
		tabMain.addTab("Test Tab", pnlBP);
		
		pane.add(tabMain);
		
		frame.pack();
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		
	}
	
	public void changeText(String text) {
		txtRoom.setText("hier soll es sich ändern :)");
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (UnsupportedLookAndFeelException e) {
			e.printStackTrace();
		}
		new Test().win();
		
		for(int i = -5000; i< 55555; i++) {
			
		}
		System.out.println("text");
		new Test().changeText("");
		
	}

}

liegt es an dem methoden aufruf selbst,sprich weil ich sozusagen ein neues klassenobjekt erzeuge mit "new Test().changeText();"?
 
bah!
ok folgefrage: wie greife ich aus einer anderen klasse heraus auf mein jtextfield zu, ohne es statisch zu als deklarieren.
ODER: wie kann ich das LAF von statisch deklarierten swing objekten ändern?der grund für das zuvor erstellte Frame objekt war, dass ich nicht auf das JTextField zugreifen konnte,ohne es statisch zumachen.sobald es statisch war, hat es nicht auf das gesetzte LAF reagiert.???:L
 
Zuletzt bearbeitet:
die neue Frage scheint mit nicht von LaF oder TextFeldern oder Swing speziell abhängen,
überlege dir allgemein die Kommunikation zwischen Klassen,

statisch kann global zugegriffen werden, dafür nur einmal, bei Swing gerade noch vertretbar gegenüber anderen Fällen, wenn auch immer unschön,
alles nicht-statische muss gegeneinander bekannt gemacht werden, Parameter in Konstruktoren oder später per set und get usw.
 
wie kann ich das LAF von statisch deklarierten swing objekten ändern?der grund für das zuvor erstellte Frame objekt war, dass ich nicht auf das JTextField zugreifen konnte,ohne es statisch zumachen.sobald es statisch war, hat es nicht auf das gesetzte LAF reagiert.???:L

anstatt nur new Test().win() aufzurufen, solltest Du eine Referenz auf das Objekt erzeugen:

Code:
		Test test = new Test();

		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		test.changeText("Neuer Text");

Ich habe Dein Code das win() mit Test() umbenannt (Konstruktor) und bei mir wird der Text geändert.
 
Zuletzt bearbeitet:
die neue Frage scheint mit nicht von LaF oder TextFeldern oder Swing speziell abhängen,
überlege dir allgemein die Kommunikation zwischen Klassen,

statisch kann global zugegriffen werden, dafür nur einmal, bei Swing gerade noch vertretbar gegenüber anderen Fällen, wenn auch immer unschön,
alles nicht-statische muss gegeneinander bekannt gemacht werden, Parameter in Konstruktoren oder später per set und get usw.

naja das ist mir ja jetzt sogar wieder etwas kalrer,stand da echt auf dem schlauch.jetzt aber die frage: warum werden statische swing objekte bei mir nicht mit dem gesetzten LaF dargestellt?

noch als Tipp 😀

wenn du "txtRoom.setEditable(false)" machst kannst du auch gleich nen JLabel verwenden oda? 😀

ich finde das JTextField besser,weil es etwas hervorgehoben ist und dem Benutzer so etwas eher ins auge springt,als die JLabel. Die Border um so ein JLabel sahen eig nicht so dolle aus.

anstatt nur new Test().win() aufzurufen, solltest Du eine Referenz auf das Objekt erzeugen:

Code:
		Test test = new Test();

		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		test.changeText("Neuer Text");

Ich habe Dein Code das win() mit Test() umbenannt (Konstruktor) und bei mir wird der Text geändert.
dies ist mir bereits bekannt,siehe EDIT vom start post. mein problem ist jetzt,dass mein gesetztes LaF
keine statischen objekte mag. wenn sie aber nicht statisch sind,kann ich aus anderen klassen heraus nicht auf diese zugreifen ohne eine neue klassen instanz zu erzeugen?
 
> warum werden statische swing objekte bei mir nicht mit dem gesetzten LaF dargestellt?

ich sehe keinen Einfluss von static oder nicht static, vielleicht mit Code zu klären, vielleicht wieder ganz was anderes,
sonst halt nicht (von mir zu lösen)
 
ich sehe keinen Einfluss von static oder nicht static, vielleicht mit Code zu klären, vielleicht wieder ganz was anderes,
sonst halt nicht (von mir zu lösen)

könntest du freundlicherweise das statisch/nicht statisch problem mit dem LaF anhand des geposteten codes bestätigen?hab gerade noch einen JButton hinzugefügt, sobald ich ihn private static deklariere wird er vom LaF nicht abgeändert. es müsste aber auch anhand des JTextFields deutlich werden.


EDIT: sobald ich die das Klasse extends JFrame setze und mir ein Fenster mit einem Konstruktor erstelle funktioniert es, wenn man die klasse aus einer anderen heraus aufruft! woran kann das liegen?
 
Zuletzt bearbeitet:
ok, habe es nun nachvollzogen,
das Problem ist, dass statische Variablen ganz zu Beginn erzeugt werden, bevor dein setLookAndFeel() ausgeführt wird,
alles was nach dem setLookAndFeel() noch kommt, das neue JFrame usw., wird neu richtig erstellt,
das bereits vorhandene statische TextFeld bleibt alt,
durch mehrere Klassen wird die statische Variable eben erst später initialisiert, wenn diese Klasse benötigt wird, das klappt dann

allgemein gehört zu einem neuen LookAndFeel immer der Befehl
SwingUtilities.updateComponentTreeUI(frame);
dann sollte nichts schiefgehen für die im JFrame enthaltenen Komponenten, egal wann erzeugt,
schließlich kann man ja auch nach Stunden laufenden Programms noch umschalten,
besser aber schon so wie du es hast, möglich früh

statische Swing-Komponenten sind also in dieser Hinsicht leicht nachteilig
 
wenn sie aber nicht statisch sind,kann ich aus anderen klassen heraus nicht auf diese zugreifen ohne eine neue klassen instanz zu erzeugen?
Das ist kein Grund static zu verwenden. Wenn man korrekt programmiert kann man aus anderen Klassen auch auf nicht statische Objekte. Sowas ist nur Murks - den allerdings viele Anfänger gerne machen, weil es scheinbar so eine einfache "Lösung" ihres Problems zu sein scheint.
==> Klassen objektorientiert programmieren, löst diese Problem.

Zu den LaF "Problem", das liegt vermutlich daran, dass die statisch referenzierten Objekte vermutlich vor dem Setzen des LAFs erzeugt werden. Hier gelten dann die üblichen Maßnahmen beim Ändern des LaFs zu Laufzeit.
Aber wie bereits angemerkt würde das "Problem" bei einer sauberen Programmierung gar nicht auftreten.
 
gut dann lag ich mit meiner vermutung richtig.
leicht nachteilig,aber anders komme ich an diese komponenten von ausserhalb leider nicht ran?
die getter und setter methoden müssten ja auch statisch sein um auf diese von aussen zugreifen zu können?
danke für die aufklärung an dieser stelle 🙂

EDIT: Michael, könntest du mir bitte ein kurzes Beispiel deiner Idee aufschreiben bzw. etwas genauer erläutern was genau du meinst?
 
Zuletzt bearbeitet:
> die getter und setter methoden müssten ja auch statisch sein um auf diese von aussen zugreifen zu können?

nein, von allen Klassen können immer Objekte erstellt und gegenseitig bekannt gemacht werden,
z.B. in der main-Methode:

Gui g = ..;
Controller c = ..;
c.setGui(g);
g.setController(c);
usw.

je nach Fähigkeiten und Gegebenheiten kann man es schöner gestalten, als solch langweilige Code-Zeilen,
grundsätzlich kann die Welt aber auch ohne static existieren
 
okay, es scheint,dass ich es erst jetzt richtig zu verstehen anfange....
dennoch entzieht sich mir noch wo genau der vorteil von nicht-statischen gegenüber statischen objekten sein soll.
schlichtes beispiel: 2 Fenster der GUI sind vorhanden.ersteres ist das Hauptfenster und verfügt über einen Button, der das zweite Fenster aufruft. Gewisse Änderungen im zweiten Fenster werden anschließend im ersten angezeigt.

hier kann ich doch schlecht erst zwei objekte erzeugen,da ich von anfang an zwei fenster hätte.
ich merke gerade,dass mir "gute" codebeispiele fehlen bezüglich guter objektorientierter programme...

EDIT: hm das szenario würde nur bei klassen mit "extends JFrame" ein problem darstellen?
 
dein Beispiel ist wenig verständlich, was ist ein Fenster? wenn du zwei Fenster-Klassen hast, wieso sollte dann schlecht sein 2 Fenster zu erzeugen?

es muss nicht alles schon am Anfang erzeugt werden, richtig,
wenn Objekt A nach 10 Min. Objekt B erzeugt, kann zu diesem Zeitpunkt set aufgerufen werden oder was immer nötig ist

gerade dieses dynamische, zeitliche, gar Mehrfacherzeugung, spricht besonders gegen static,
denn static werden typischerweise nur einmal am Anfang erzeugt und bleiben für immer da
 
denn static werden typischerweise nur einmal am Anfang erzeugt und bleiben für immer da

wenn wir von variablen ausgehen,dann gilt dies doch nur für diese ansich.nicht aber für deren Inhalt.
so könnte ich doch gewisse variable statischen deklarieren,aber noch nicht befüllen. später im programm werden diese variablen dann von dynamischen klassenobjekten genutzt.evtl wird es durch den code hier etwas deutlicher was ich meine:

Java:
public class MeineKlasse {
	
	public static String strStatic;
	
	public static void meineMethode() {
		//code abarbeiten und auf variable strStatic zugreifen
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//Hier die KlassenObjekte erzeugen, die dann meineMethode aufrufen
                BspClass test = new BspClass();
}
}

natürlich wäre es mit getter/setter an dieser stelle ebenfalls möglich, wie du dies zuvor beschrieben hast. bezogen auf meine GUI mit dem JTextField: Dieses und weitere swing Objekte in meinem Hauptfenster werden ja eben nur ein mal erzeugt, da ich ja nur ein Hauptfenster haben (will). Trotzdem wird an dieser Stelle static nicht empfohlen,warum?
 
ein Grund mit der UI wurde hier ja offensichtlich,
ansonsten habe ich gerade keine Lust weitere aufzuzählen, das ist immer mühsam,
solange du keinerlei Nachteil erlebst kannst du ja static verwenden und nur dann davon abgehen, wenn es einen guten Grund gibt,
das ist ein natürlicher sinnvoller Prozess,
gleich alles richtig lernen zu wollen ist zwar auch gut, aber Regeln ohne Verständnis zu folgen wiederum nicht,
na deshalb fragst du ja, passt schon,
für mich aber zuviel Aufwand, kannst auch im Internet suchen
 
verständlich,kommen ja bestimmt täglich mehrere mit den selben anfängerfehlern 😀
nur noch eine kurze Frage: hat ein programm ohne statische Elemente einen Performance-Voteil gegenüber einem statisch gestalteten Programm?
 
wenn dann eher Nachteil, aber in einem Blinzeln können tausende Klassen und statische Variablen durchlaufen werden,
das ist nun wahrlich kein Faktor

es ist eine Frage der Organisation, Code-Verständnis usw., nicht Performance
 
gut,dann gehe ich mal mein Programm umschreiben und mich weiterbilden.
danke für die hilfe,insbesondere für:
" Gui g = ..;
Controller c = ..;
c.setGui(g);
g.setController(c); "
 

Zurück
Oben