Text in Label ändern

nossek

Aktives Mitglied
Hallo,
(denke mal das Thema ist hier besser aufgehoben als im GUI-Unterforum, oder?!)

ich möchte ein ganz einfaches Programm schreiben, das ein Fenster öffnet, das 3 Buttons (Plus, Minus und Exit) enthält sowie ein Label (könnte auch eine TextComponent sein, soll jedenfalls nur anzeigen - für die Frage vermutlich unerheblich).

Beim Start zeigt das Label 0 an. Ihr ahnt es, wenn der Plus-Button gedrückt wird, soll der im Label angezeigte Wert um 1 erhöht werden, wenn der Minus-Button gedrückt wird eben um 1 vermindert.

Bislang sieht der code so aus, der ActionListener:
Java:
import java.awt.event.*; 

class MyActionListener implements ActionListener {
    int zaehler = 0;

    public void actionPerformed(ActionEvent ae) {
        String s = ae.getActionCommand();
        if (s.equals("Exit")) {
            System.out.println("Programm wird beendet");
            System.exit(0);
        }
        if (s.equals("Plus")) {
            zaehler++;
            System.out.println(zaehler);
        }
        if (s.equals("Minus")) {
            zaehler--;
            System.out.println(zaehler);
        }
    }

}
Das Hauptprogramm:
Java:
import java.awt.*;
import java.awt.event.*;

public class Main {
    public static void main(String[] args){

        Button b;
        Label l = new Label("1", Label.CENTER);
        ActionListener a = new MyActionListener();
        Frame f = new Frame();

        f.add(l, BorderLayout.NORTH);

        f.add(b = new Button("Plus"), BorderLayout.WEST);
        b.addActionListener(a);

        f.add(b = new Button("Minus"), BorderLayout.CENTER);
        b.addActionListener(a);

        f.add(b = new Button("Exit"), BorderLayout.EAST);
        b.addActionListener(a);

        f.pack();
        f.setVisible(true);
    }
}

Wie man sieht, wird der neue Wert des Zählers bislang nur in der Konsole ausgegeben.

Mal abgesehen davon, daß an dem Programm bestimmt vieles zu kritisieren ist, folgene Fragen:

- Wie bekomme ich es hin daß der neue Wert im Label angezeigt wird?

- Mir kommt das seltsam vor, daß die Variable zaehler ein attribut vom ActionListener ist. Nach meiner Vorstellung sollte der Zähler ein Attribut von main sein. Jedenfals nicht vom ActionListener. Wie kann denn Der ActionListener dafür sorgen, daß eine Variable "ausserhalb" verändert werden kann?

Habe folgendes Codebeispiel gefunden, ein Alptraum, vlt. sollte ich doch besser auf H9Q+ umsteigen ;)
Java/GUI Beispiel Zähler ? ZUM-Wiki
 
Zuletzt bearbeitet von einem Moderator:

Haave

Top Contributor
Die Klasse Label hat doch eine Methode setText(String text), da kannst du doch das int zaehler als String übergeben und eine eigene Methode schreiben, die den Text bei jeder Änderung von zaehler anpasst (updateLabel() oder so).

BTW: Ich habe gehört, es solle nicht so ratsam sein, auf AWT noch eine komplette GUI aufzubauen, da es veraltet sei, und man solle lieber Swing nehmen. Da gibt's dann JButton, JLabel etc. (letztes hat auch eine Methode setText() ;)).
 

ProgX

Aktives Mitglied
Normalerweise müsste es sich nach dem Aufruf von .setText() selbst updaten!
Hat bei mir jedenfalls immer funktioniert! ;-)
 

Michael...

Top Contributor
- Mir kommt das seltsam vor, daß die Variable zaehler ein attribut vom ActionListener ist. Nach meiner Vorstellung sollte der Zähler ein Attribut von main sein. Jedenfals nicht vom ActionListener.
main kann keine Attribute besitzen, da es sich hierbei nicht um ein Objekt sondern um eine statische Klasse handelt ;-)
Habe folgendes Codebeispiel gefunden, ein Alptraum, vlt. sollte ich doch besser auf H9Q+ umsteigen ;)
Java/GUI Beispiel Zähler ? ZUM-Wiki
Da muss ich zustimmen. Dafür das es als Beispiel dient ist es etwas unschön. (Liegt u.a. daran, das ein GUI Editor zur Erstellung der Oberfläche verwendet wurde. Aber immerhin zeigt es sehr schön wie man objektorientiert programmiert. Der Zähler ist hierbei nicht einfach eine primitive Variable sondern ein echtes Objekt.

Hier mal zwei Demos wie man Dein Problem lösen könnte. Die Variable zaehler ist dabei nicht Attribut des Listeners. Man könnte sie noch in eigenes Model auslagern, das wäre hier aber vielleicht etwas übertrieben. Ich persönlich würde die Variante in Demo1 bevorzugen, das sie recht kompakt ist:
Java:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class ActionListenerDemo extends JFrame {
	
	public ActionListenerDemo() {
		this.getContentPane().setLayout(new GridLayout(2, 1, 0, 20));
		this.getContentPane().add(new Demo1());
		this.getContentPane().add(new Demo2());
	}
	
	class Demo1 extends JPanel {
		private int zaehler;
		private JLabel label;
		
		public Demo1() {
			this.setLayout(new BorderLayout());
			zaehler = 0;
		
			label = new JLabel(String.valueOf(zaehler), JLabel.CENTER);
			this.add(label, BorderLayout.CENTER);
			JButton button = new JButton("-");
			this.add(button, BorderLayout.WEST);
			button.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent evt) {
					label.setText(String.valueOf(--zaehler));
				}	
			});
			button = new JButton("+");
			this.add(button, BorderLayout.EAST);
			button.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent evt) {
					label.setText(String.valueOf(++zaehler));
				}	
			});
		}
	}
	
	class Demo2 extends JPanel {
		private int zaehler;
		private JLabel label;
		
		public Demo2() {
			this.setLayout(new BorderLayout());
			zaehler = 0;
			label = new JLabel(String.valueOf(zaehler), JLabel.CENTER);
			this.add(label, BorderLayout.CENTER);
			
			ActionListener listener = new ZaehlerListener(this);
			JButton button = new JButton("-");
			this.add(button, BorderLayout.WEST);
			button.addActionListener(listener);
			button = new JButton("+");
			this.add(button, BorderLayout.EAST);
			button.addActionListener(listener);
		}
		
		public void increaseNumber() {
			label.setText(String.valueOf(++zaehler));
		}
		
		public void reduceNumber() {
			label.setText(String.valueOf(--zaehler));
		}
	}
	
	class ZaehlerListener implements ActionListener {
		private Demo2 demo;
		
		public ZaehlerListener(Demo2 demo) {
			this.demo = demo;
		}
		
		public void actionPerformed(ActionEvent evt) {
			String command = evt.getActionCommand();
			if (command.equals("-"))
				demo.reduceNumber();
			else if (command.equals("+"))
				demo.increaseNumber();
			else
				System.out.println("Invalid action command: " + command);
		}	
	}
	
	public static void main(String[] args) {
		JFrame frame = new ActionListenerDemo();
		frame.setBounds(0, 0, 300, 200);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
 

nossek

Aktives Mitglied
Danke zunächst einmal an alle! Muß mir das alles in Ruhe anschauen und probieren.

GUI-Orgrammierung scheint einer der schwierigsten Teile von Java zu sein - und wenn ich mir die Lehrbücher anschaue scheint sie auch die höchsten Ansprüche an die didaktischen Fähigkeiten der Autoren zu stellen. Daß AWT veraltet ist habe ich natürlich auch schon gelesen. Trotzdem werden in allen swing-Beispielen auch AWT-Elemente eingebunden, das ist schon alles sehr verwirrend.

Zunächst einmal:
main kann keine Attribute besitzen, da es sich hierbei nicht um ein Objekt sondern um eine statische Klasse handelt
Ähhh, daß main eine statische Klasse ist war mir schon klar. Und das eine statische Klasse keine Attribute besitzt irgendwie auch.
Wenn wir haben:
Java:
public static void main(String[] args){
     int i;
     ...
was ist den dann die korrekte Bezeichnung für i? Globale Variable?
 

XHelp

Top Contributor
Methodenvariable. Die ist dann nur im Methodenstack und ich für andere nicht sichtbar, deswegen hat es mit "global" nichts zu tun.
 

Michael...

Top Contributor
main kann keine Attribute besitzen, da es sich hierbei nicht um ein Objekt sondern um eine statische Klasse handelt
Meinte na klar statische Methode
Wenn wir haben:
Java:
public static void main(String[] args){
     int i;
     ...
was ist den dann die korrekte Bezeichnung für i? Globale Variable?
i ist eine Methodenvariable die nur lokal also innerhalb der Methode gilt.
Trotzdem werden in allen swing-Beispielen auch AWT-Elemente eingebunden, das ist schon alles sehr verwirrend.
Swing basiert auf AWT und verwendet u.a. Events aus diesem Package. Wichtig ist, dass man keine GUI Elemente beider Packages gemeinsam verwendet.
 

nossek

Aktives Mitglied
Michael, Deine Demo-Beispiele sind sehr hilfreich und eine gute Grundlage für eigene Experimente, vielen Dank nochmals.

Du hast Recht, Demo1 ist kompakter, allerdings ist mir die Syntax des folgenden Ausdrucks nicht vertraut:
Java:
button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    label.setText(String.valueOf(++zaehler));
                }   
            });
Objekt.methode(Argument)
ist soweit natürlich bekannt, nur das Argument ist in diesem Fall ja
new InterfaceName() Anweisungsblock
das habe ich bislang nocht nicht gesehen und verstehe es nicht. Kann das jemand näher erläutern? Gibt es andere Beispiele für diese Syntax? (hat wohl was damit zu tun daß ActionListener ein Interface ist?!).

Frage 2:
Spricht etwas dagegen daß (bei einem überschaubaren Projekt wie diesem) die Komponenten (JBUtton, JPanel etc.) Attribute der von JFrame abgeleiteten Klasse sind? Das erscheint mir zunächst einmal übersichtlicher.

Frage 3:
Irgendwie erscheint es mir nicht richtig, daß die Varible zaehler ein Attribut vom JPanel oder JFrame ist. Nach meinem Verständnis ist ein JFrame bzw. JPanel ja dazu dar, Daten darzustellen bzw. Zugriff auf Daten zu ermöglichen. Und nicht, die Daten zu enthalten.

Grübel, die Klasse Frame muß wohl schon eine Referenz auf ein Objekt der Klasse Zaehler als Attribut enthalten, gell? Und dann eine Methode setZaehler(Zaehler) haben, um die Verbindung herzustellen.

Und dann vielleicht so:
Java:
public class Main {
    public static void main(String[] args) {
        Zaehler zaheler = new Zaheler();
        MyJFrame frame = new MyJFrame();
        frame.setZaehler(zaehler);     
    }
}
Geht das in die richtige Richtung?
 

Haave

Top Contributor
Du hast Recht, Demo1 ist kompakter, allerdings ist mir die Syntax des folgenden Ausdrucks nicht vertraut:
Java:
button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    label.setText(String.valueOf(++zaehler));
                }   
            });
Objekt.methode(Argument)
ist soweit natürlich bekannt, nur das Argument ist in diesem Fall ja
new InterfaceName() Anweisungsblock
das habe ich bislang nocht nicht gesehen und verstehe es nicht. Kann das jemand näher erläutern? Gibt es andere Beispiele für diese Syntax? (hat wohl was damit zu tun daß ActionListener ein Interface ist?!).
Das nennt sich anonyme Klasse - hier mal ein Link, was die Java-Insel dazu sagt: Klick
 

Michael...

Top Contributor
, allerdings ist mir die Syntax des folgenden Ausdrucks nicht vertraut:
Java:
button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    label.setText(String.valueOf(++zaehler));
                }   
            });
Objekt.methode(Argument)
ist soweit natürlich bekannt, nur das Argument ist in diesem Fall ja
new InterfaceName() Anweisungsblock
das habe ich bislang nocht nicht gesehen und verstehe es nicht. Kann das jemand näher erläutern? Gibt es andere Beispiele für diese Syntax? (hat wohl was damit zu tun daß ActionListener ein Interface ist?!).
Hat jetzt nicht direkt was damit zu tun, dass es sich um ein Interface handelt, das geht auch mit Klassen.
Hier wird einfach eine innere anonyme Klasse definiert, die ActionListener implementiert. Im Gegensatz zu Demo2 hier wird eine "bekannte" Klasse verwendet.
Frage 2:
Spricht etwas dagegen daß (bei einem überschaubaren Projekt wie diesem) die Komponenten (JBUtton, JPanel etc.) Attribute der von JFrame abgeleiteten Klasse sind? Das erscheint mir zunächst einmal übersichtlicher.
Meiner Meinung spricht da nichts dagegen.
Frage 3:
Irgendwie erscheint es mir nicht richtig, daß die Varible zaehler ein Attribut vom JPanel oder JFrame ist. Nach meinem Verständnis ist ein JFrame bzw. JPanel ja dazu dar, Daten darzustellen bzw. Zugriff auf Daten zu ermöglichen. Und nicht, die Daten zu enthalten.

Grübel, die Klasse Frame muß wohl schon eine Referenz auf ein Objekt der Klasse Zaehler als Attribut enthalten, gell? Und dann eine Methode setZaehler(Zaehler) haben, um die Verbindung herzustellen.

Und dann vielleicht so:
Java:
public class Main {
    public static void main(String[] args) {
        Zaehler zaheler = new Zaheler();
        MyJFrame frame = new MyJFrame();
        frame.setZaehler(zaehler);     
    }
}
Geht das in die richtige Richtung?
Bei so einfachen Sachen nicht unbedingt notwendig, bei umfangreicheren Projekten aber üblich. siehe Link den Du mal gepostest hast oder auch MVC Pattern
 

nossek

Aktives Mitglied
Herzlichen Dank für die wieder einmal schnellen und hilfreichen Antworten!
Vielleicht muß ich nun doch nicht auf H9Q+ umsteigen.
Da die ursprüngliche Frage beantwortet ist drücke ich den "Erledigt-Button".
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Text vom Label ändern Java Basics - Anfänger-Themen 14
S Java Label hat komischen text Java Basics - Anfänger-Themen 4
F Erste Schritte Label Text vor Methodenaufruf setzen Java Basics - Anfänger-Themen 17
W Klassen Fehler bei public void setLabelText(JLabel label, String text) Java Basics - Anfänger-Themen 11
H Text aus Textfeld per Actionlistener in Label ausgeben. Java Basics - Anfänger-Themen 6
M Text in Label per Button Java Basics - Anfänger-Themen 4
richis-fragen JTable effektiv angezeigter Text ausgeben nicht Inhalt vom Model Java Basics - Anfänger-Themen 9
A Edit Text Negative Decimalzahlen Java Basics - Anfänger-Themen 18
P Aus Text Datei nur Zahlen übernehmen Java Basics - Anfänger-Themen 13
T Text einlesen code was kommt dahin? Java Basics - Anfänger-Themen 1
R Text in der DB abspeichern, und danach bearbeiten Java Basics - Anfänger-Themen 5
A JTextArea entfernen und durch neuen Text ersetzen Java Basics - Anfänger-Themen 8
JavaBeginner22 Button Text verändern Java Basics - Anfänger-Themen 1
GoenntHack Java Text von JLabel verändert sich nicht Java Basics - Anfänger-Themen 1
A Text zu Morsecode Java Basics - Anfänger-Themen 8
O Java Text Area Zeilenausgabe Java Basics - Anfänger-Themen 7
M Text wird in der Console nicht ausgegeben. Java Basics - Anfänger-Themen 11
berserkerdq2 An selbst ersteller txt Datei immer Text dranhängen, ohne den vorherign Text zu löschen Java Basics - Anfänger-Themen 8
M Text in Datei schreiben Java Basics - Anfänger-Themen 9
T208 Text Datei individuell benennen. Java Basics - Anfänger-Themen 5
A Werten aus dem Text ausliesten Java Basics - Anfänger-Themen 6
K Jlabel mit itemlistevent Text gegeben, wird nicht angezeigt Java Basics - Anfänger-Themen 5
Kiki01 Wie würde eine geeignete Schleife aussehen, die die relative Häufigkeit für jeden Charakter in einem Text bestimmt? Java Basics - Anfänger-Themen 3
O Text mit Regex trennen und wieder zusammenbauen Java Basics - Anfänger-Themen 5
xFlozen Text mehrspaltig ausgeben Java Basics - Anfänger-Themen 3
S Zufällige ungerade Zeile aus Text-Datei lesen Java Basics - Anfänger-Themen 5
K Rekursiver Vergleich von Textmuster und Text Java Basics - Anfänger-Themen 2
C Variablen Provided text for message may not be null Java Basics - Anfänger-Themen 9
H Klassen Die Länge einer Text-Node bestimmen Java Basics - Anfänger-Themen 2
F Erste Schritte java.util.Scanner: Beliebig langen Text per Paste in Console eingeben ? Java Basics - Anfänger-Themen 14
GermanPie Discord Text Channel erstellen? Java Basics - Anfänger-Themen 1
C JButton Text 2 Mal ändern funktioniert nicht Java Basics - Anfänger-Themen 8
yoskaem Text Color durch Klicken eines Buttons in anderer Activity ändern Java Basics - Anfänger-Themen 2
B Alle Links in einem Text suchen und ersetzen mit einem neuen Link Java Basics - Anfänger-Themen 18
J Java TextArea Text bei hinzufügen makieren Java Basics - Anfänger-Themen 1
T Text-Ausgabe für Textadventure - Organisation Java Basics - Anfänger-Themen 5
G Anklickbaren Text erzeugen Java Basics - Anfänger-Themen 2
B Text-Datei nur in Stream speichern und dann ausgeben Java Basics - Anfänger-Themen 3
M Java: BufferedReader liest nur die Hälfte der Text-Datei. Java Basics - Anfänger-Themen 4
M Apache POI PPT - Vertikales Alignment von Text im XSLFAutoShape Java Basics - Anfänger-Themen 2
I Nur auf Abfrage von einer Text Datei einlesen Java Basics - Anfänger-Themen 11
P Text Datei einlesen und übertragen Java Basics - Anfänger-Themen 15
P Taschenrechner Text übertragung Java Basics - Anfänger-Themen 3
J java.text.DecimalFormat Java Basics - Anfänger-Themen 5
AnnaBauer21 GridBagLayout JLabel weightx: Unterschiedliche Breite mit & ohne Text Java Basics - Anfänger-Themen 6
K Durch eine Text eingabe etwas Ausführen Java Basics - Anfänger-Themen 5
S Text-To-Speech mit Java Java Basics - Anfänger-Themen 2
L Text-Adventure Java Basics - Anfänger-Themen 3
M Input/Output Java Swing: Prüft ob Text aus JTextField ausschließlich Integer enthält Java Basics - Anfänger-Themen 15
ruutaiokwu Ausgegebene Zeile ersetzen mit neuem Text Java Basics - Anfänger-Themen 3
tsom Erste Schritte itext Text als Block auf neue Seite Java Basics - Anfänger-Themen 0
Dimax Programme ,als Text in MySql speichern Java Basics - Anfänger-Themen 7
CptK Datentypen Text Dateien einlesen Java Basics - Anfänger-Themen 3
Harlequin Compiler-Fehler Text Adventure - "Long Output" Fehler Java Basics - Anfänger-Themen 3
S Zeichen zählen kopierter Text Java Basics - Anfänger-Themen 6
D Text als Code in java-forum.com formatieren. Wie ? Java Basics - Anfänger-Themen 3
F Schreibprogramm nur markierten Text in kursiv oder fett schreiben Java Basics - Anfänger-Themen 3
A Rechnen mit Text und Zahl Java Basics - Anfänger-Themen 4
MaximilianTM Input/Output Einlesen und bearbeiten einer text Datei / Zeile Java Basics - Anfänger-Themen 5
M Erste Schritte Verschlüsselung von text Java Basics - Anfänger-Themen 21
S Text aus einer HTML Datei auslesen Java Basics - Anfänger-Themen 1
S Java Text splitten mit Tabs, Zeilen, Zeichen und Klammern. Java Basics - Anfänger-Themen 6
M Beliebigen Text in *** umwandeln Java Basics - Anfänger-Themen 15
K (JTable) Text einer Zelle auf der linken Seite kürzel Java Basics - Anfänger-Themen 2
H Suche in Text und Markierung Java Basics - Anfänger-Themen 14
H Suche in einem Text Java Basics - Anfänger-Themen 17
F Input/Output Text einlesen lassen Java Basics - Anfänger-Themen 14
L Text eingeben und im Textfeld auslesen lassen Java Basics - Anfänger-Themen 2
R Best Practice Palindrom in einem Text finden Java Basics - Anfänger-Themen 18
J Text Datei einlesen Java Basics - Anfänger-Themen 6
L Text und Ganzzahl in einer Dialogbox Java Basics - Anfänger-Themen 5
D Text Adventure Erstellen Java Basics - Anfänger-Themen 10
T Jlabel durch Text in 2 anderen Jlabels sichtbar machen Java Basics - Anfänger-Themen 4
J JTextArea visible ohne Text Java Basics - Anfänger-Themen 3
D Bild zu Text Java Basics - Anfänger-Themen 4
L Text/Befehle zu Programmen senden Java Basics - Anfänger-Themen 1
L Java Text datei nur bis zu einem Punkt auslesen? Java Basics - Anfänger-Themen 3
T Classpath Problem mit dem auslesen von Text-Dateien (Pfad) Java Basics - Anfänger-Themen 3
S Erste Schritte Sprachermittler - Datei öffnen, Text in TextArea, Bereinigen, Auswerten Java Basics - Anfänger-Themen 14
F Text anhand bestimmter Trennzeichen in Textteile trennen (netbeans) Java Basics - Anfänger-Themen 7
S Ausgabe von Text Formatieren Java Basics - Anfänger-Themen 6
H Text in einen Button quetschen Java Basics - Anfänger-Themen 3
A Text mit "Scanner" eingeben und Umlaute ersetzen Java Basics - Anfänger-Themen 7
A Text teilen und Wörter zählen Java Basics - Anfänger-Themen 7
J Zahlen als Text übersetzen Java Basics - Anfänger-Themen 6
R Text Pane Aktualisierung erst nach JOptionPane Java Basics - Anfänger-Themen 10
I BufferedReader Text-Datei einlesen??? Java Basics - Anfänger-Themen 1
S Wort in Text suchen und ersetzen Java Basics - Anfänger-Themen 3
V Interface ich schäme mich das zu fragen, aber ich schaff nicht ein Text zu zentrieren :( [javaFX] Java Basics - Anfänger-Themen 6
M Input/Output Text auf Fenster zeichen Java Basics - Anfänger-Themen 2
Chava Testprojekt.Text.Image.Button Java Basics - Anfänger-Themen 4
Z JSlider - Text wird nich angezeigt Java Basics - Anfänger-Themen 0
A Problem mit set.Text und übergabe Java Basics - Anfänger-Themen 2
A Probleme mit equals und get.Text Java Basics - Anfänger-Themen 12
M Text innerhalb Anführungsstriche als "eins" auswerten Java Basics - Anfänger-Themen 5
V Text aus einer .txt dynamisch ins applet einpassen Java Basics - Anfänger-Themen 0
H Text durch Checkbox erscheinen lassen Java Basics - Anfänger-Themen 2
U markierten Text auf Zeichen zuvor/danach pruefen Java Basics - Anfänger-Themen 9
J Dienst zum Text kopieren und Variable hochzählen Java Basics - Anfänger-Themen 7
L Text verschlüsseln Java Basics - Anfänger-Themen 13

Ähnliche Java Themen

Neue Themen


Oben