Generelle Vorgehensweise Eventhandling bei GUI Programmierung

G

gismo

Gast
Hallo Forum,

ich möchte zwecks Einarbeitung in die Materie ein JFrame mit einem textfeld versehen, welches ich über einen Button "Abfrage". Dieses Ergebnis gebe ich auf der Konsole aus und zusätzlich als JProgressBar (TXT ist ein int wert).

Ich habe den Frame gebaut und die Elemente Platziert das eventhandling implementiert und kann auch wunderbar den Wert aus dem TXT Feld Auslesen und über die Konsole wiedergeben, aber das durchreichen an den JProgressBar funktioniert nicht.

was habe ich getan
1)Hauptklasse gebaut die deine GUI klasse aufruft
2) GUI Klasse Gebaut die eine methode Hauptfenster enthällt, darin definiere ich den JFrame
weiter denn die Ereignisbehandlung, Erzeugung der Elemnete ( Buttons und Co ), elemente auf Frame Platzieren, schaltfäche bei Aktion Listner registrieren und zum schluss alles auf visible.

wenn ich das nun Aufrufe wird das Bild gebaut ich kann den Text (int wert) über den Button abfragen, das Progessbar teil wird aber nicht neu gezeichnet auch wenn ich den ganzen Klumpatsch noch mal neu in der Ereignisbehandlung aufführe.

Ich frage mich wie kann ich denn eine Interaktion realisieren?

Danke und Grüße
 
T

Tomate_Salat

Gast
du rufst den zuständigen Setter der Objektreferenz auf und änderst diesen. Zu allgemein? Dann poste deinen (relevanten) Quellcode.
 

damtre

Aktives Mitglied
Meinst du sowas hier?

Java:
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.JProgressBar;
import javax.swing.JTextField;


public class Test extends JFrame {

	public Test() {
		super("Hallo Welt!");
		setLayout(new GridLayout());
		init();
		setLocationRelativeTo(null);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
		pack();
	}
	
	public void init(){
		final JTextField tField = new JTextField("50");
		add(tField);
		
		final JProgressBar pBar = new JProgressBar();
		pBar.setMinimum(0);
		pBar.setMaximum(100);
		pBar.setStringPainted(true);
		
		JButton button = new JButton("Klick mich!");
		button.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				System.out.println(tField.getText());
				pBar.setValue(Integer.parseInt(tField.getText()));
			}
		});
		
		add(button);
		add(pBar);
		
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Test();
	}
}

Grüße
 
G

gismo

Gast
Hallo,
anbei mein Code
Java:
package A;

public class HAUPTKLASSE {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		new GUI();
			}

}



package A;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.JTextField;


public class GUI extends JFrame {
	
	 JTextField eingabe;
	 JButton buttoneingabe;
	 String eingabetext;
	 int wert;
	
	//Methode Hautfenster
	public GUI(){
				
		//Einen Titel einstellen
		super("Ein Tietel");
	
		setDefaultCloseOperation(
				JFrame.EXIT_ON_CLOSE);
		//Fenstergröße
	    setSize(600,400);
		//Die Start Position einstellen
		setLocation(50,50);
		//Layout für Spätere Elemnete Festlegen
		setLayout(null);
		//Frame gebaut ab hier werden die Elemente eingefügt
	///----------------------------------------------------------------------------------------
	
	//	Ereignissbehandlung
		
	//-----------------------------------------------------------------------------------------
		   // Ereignisbehandlung Tiefeneingabe Button gedrückt
		  class ActionLauscherWert implements ActionListener {
		    public void actionPerformed(ActionEvent e) {
		      
		  //Text auslesen und auf der Konsole wieder raus		  
		   String eingabetext =eingabe.getText();
		     System.out.println(eingabetext);
		    // String eingabetext int zuweisen
		     wert = Integer.parseInt(eingabetext);
		     System.out.println("test");
		     System.out.println(wert);
		    /*
		     * das kann eigenlich nicht richtig sein, das hier noch mal zu implementieren, 
		     * funktioniert auch nicht
		     * 
		JProgressBar aktuellerwert = new JProgressBar(0,4000);
		aktuellerwert.setBounds(250, 10, 200, 25);
		aktuellerwert.setStringPainted(true);
		aktuellerwert.setValue(wert);
		      */
		    }
		  }
		  
	
		
	
//-----------------------------------------------------------------------------------------------
		  
		  //Elemente Erzeugen
		  
//-------------------------------------------------------------------------------------------------
		
		//Textfeld bauen und Größe zuweisen		 
		eingabe = new JTextField();
		eingabe.setBounds(10, 10, 200, 25);
		  
		buttoneingabe = new JButton("Eingabe");
		buttoneingabe.setBounds(10,35,200,30);
		  
		  
		 // dieser Progressbar wird nur einmal initialisiert, denn aber nicht mehr verändert......
		JProgressBar aktuellerwert = new JProgressBar(0,4000);
		aktuellerwert.setBounds(250, 10, 200, 25);
		aktuellerwert.setStringPainted(true);
		aktuellerwert.setValue(wert);

		 
		 //-----------------------------------------------------------------------------------------
		 
		 
		  
		 // Elemte auf From Plazieren
		 
		 //----------------------------------------------------------------------------------
		 
		 add(eingabe);
		add(aktuellerwert);
		 add(buttoneingabe);
		
		 
		 //-------------------------------------------------------------------------------------------
		   // Schaltflächen bei ActionListener registrieren
		 //--------------------------------------------------------------------------------------
		   
		 buttoneingabe.addActionListener(new ActionLauscherWert());
		
	
	//------------------------------------------------------------------------------------------	 
		 
		   
		   
		   
		 
		//Das JFrame anzeigen
		setVisible(true);		
	}
	
	
	

}


[/Java]
 
G

gismo

Gast
@damtre, danke für Dein Beispiel, ich werde mich da drüber her machen (brauche ein wenig um nicht zu unqualifizierte Fragen zu stellen)

warum bekomme ich einen Fehler wenn ich die Ereignissbehandlung an´s Endte stelle?

Danke und Grüße
gismo
 
G

gismo

Gast
Wenn ich die Ereignissbehandlung innerhalb der Klasse nach ganz unten stelle bekomme ich den Fehler
"action lauscher cannot be resolved to a type"
baue ich exakt den code wieder oben ein (wie gepostet) funzt es. Hat mich zur der Annahme begracht das es zwingend so sein muss.
gismo
 
G

Gismo

Gast
Hallo damtre,
habe Deinen Code mal ausprobiert, genau das meine ich!

Ist es Üblich / Zwingend in Methode A den Frame zu bauen und in Methode B die Dinge reinzupacken die ich überwachen will?

@Tomate_Salat ich habe leider keine Ahnung was der "zuständigen Setter der Objektreferenz" ist, da werde ich wohl noch mal googlen müssen

Werd mal weiter basteln.
 

damtre

Aktives Mitglied
Was Tomate_Salat meint ist:

Java:
JProgressBar meineProgressBar = new JProgressBar();

hier ist die Objektreferenz --> meineProgressBar
und diese hat eine setter-Methode mit der du den Wert innerhalb der JProgressBar manipulieren kannst.

Java:
meineProgressbarBar.setValue(50);

Du hast ja zu Anfang schon eine Klasse die von JFrame abgeleitet ist, also kannst du da ja auch eine Methode einbauen die für das Platzieren deiner Komponenten und Listener da ist.
Wenn du das in eine Methode packst kannst du dadurch einfach ein wenig mehr Struktur reinbringen und es lässt sich besser lesen aufgrund der "Trennung".

Für die Zukunft kannst du dir auch mal das Model-View-Controller Konzept (MVC) anschauen.

Grüße
 
Zuletzt bearbeitet:
G

gismo

Gast
Danke Leute,
ich denke mein Problem war an zwei Stellen
a) wo setze ich setVisible(true); -> bei mir war ich zu früh
b) und wo packe ich den Lauscher hin

ich werde mir Model-View-Controller Konzept bei gelegenheit ansehen, jetzt brauch ich erstmal ne Pause

Danke und Grüße
Gismo
 

damtre

Aktives Mitglied
a) wo setze ich setVisible(true); -> bei mir war ich zu früh
Du setzt das setVisible(true), nachdem du die deine Komponenten auf deinem Panel platziert hast.

b) und wo packe ich den Lauscher hin

Die Komponente die auf ein Ereignis reagieren soll bekommt den Listener...

In diesem Beispiel ist es der JButton der auf den Klick reagieren soll.
Wenn ein Klickereignis auf diesen JButton ausgelöst wird, wird der Text aus dem JTextField ausgelesen und der JProgressBar mittels der Setter-Methode setValue(int value) übergeben.

Das MVC ist für den ersten AUgenblick wohl noch zu "kompliziert".
Bleib erst mal bei den Grundlagen. Das MVC macht in Zukunft bei größeren Projekten wo das Zusammenspiel von logik und visuellen Elemente ne Rolle spielt.

Grüße
 
Zuletzt bearbeitet:
T

Tomate_Salat

Gast
Anstatt die Klasse ActionLauserWert zu definieren, könntest du eine anonyme Klasse nehmen: Galileo Computing :: Java ist auch eine Insel – 8 Äußere.innere Klassen

HAUPTKLASSE würde ich auch UpperCamleCase schreiben: HauptKlasse.

und wo versuchst du, den Wert von deiner Progressbar zu ändern?

Ein nachträgliches Hinzufügen von Komponenten auf deinen Frame/Panel ist durchaus möglich, macht nur wenig sinn, da sonst deine GUI "explodiert" (damit meine ich: 30582825 Progressbars auf einem 400x300 Fenster sind unschön). Du musst nur daran denken, deine Gui zu validieren. Setze die Progressbar aber trotzdem lieber, bevor du setVisible(true); aufrufst ;-).

Zum Thema objektreferenz, das wurde ja netterweise von damtre erklärt.
 
G

Gismo

Gast
In Zeile 74 (erstes Coding) hatte ich das versucht den Wert des Progressbars zu verändern (hatte unbewusst auch schon die setter Methode verwendet)

die Aussage
"Du setzt das setVisible(true), nachdem du die deine Komponenten auf deinem Panel platziert hast."
war der für mich zündene Hinweis, habe meinen Code dahin umgebaut das ich die Erzeugung des Progrssbars hochgestllt habe und es funktioniert!

[Java]
///----------------------------------------------------------------------------------------

// Ereignissbehandlung

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

final JProgressBar aktuellerwert = new JProgressBar(0,100);
aktuellerwert.setBounds(250, 10, 200, 25);
aktuellerwert.setStringPainted(true);
// aktuellerwert.setValue(wert);
add(aktuellerwert);


// Ereignisbehandlung Button gedrückt
class ActionLauscherWert implements ActionListener {
public void actionPerformed(ActionEvent e) {

//Text auslesen und auf der Konsole wieder raus
String eingabetext =eingabe.getText();
System.out.println(eingabetext);
// String eingabetext int zuweisen
wert = Integer.parseInt(eingabetext);
System.out.println("test");
System.out.println(wert);
aktuellerwert.setValue(Integer.parseInt(eingabetext));

}
}




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

//Elemente Erzeugen

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

[/Java]

wrum muss der Progressbar eigendlich final sein? Elipse sagt mir das ja sogar netter weise? Im Galilleo Buch werde ich mal nachlesen ( das habe ich sogar :) )
 
T

Tomate_Salat

Gast
weil du es in einer inneren Klasse verwendest. Da muss der Wert "konstant" sein. Durch das final definierst du, dass diese frameReferenz auch immer auf diesen JFrame zeigt.
 

Gismo

Neues Mitglied
Danke für den Tip, das mit den inneren Klassen hatte ich bis dahin überhaupt nicht auf dem Zettel :rtfm:

@ForenAdmin, kann diesen Thread nicht als erledigt markieren (war vorher als Gast angemeldet), kann da jemand nachhelfen?
 

Ähnliche Java Themen


Oben