Mein Programm rechnet lieber als dass es malt - warum?

Status
Nicht offen für weitere Antworten.

Corcovado

Bekanntes Mitglied
Hallo
ich habe ein Problem mit einem Button in meinem Program.
Ich habe einen Button, der eine Berechnung starten soll, daneben is ein Panel, welches vorher gruen war.
Wenn der Button geklickt wird, soll der Button passiv werden und das Panel (progresspanel) rot, nach der Berechnung sollte es wieder gruen werden und der Button auch wieder enabled werden.

So - ich habe es genau in der Reihenfolge eingetippst (s.u.):
progresspanel soll rot werden
butOption[1] soll disabled werden
start() - Berechnung soll starten
butOptions[1] soll wieder enabled werden
progresspanel soll wieder gruen werden

Mein Programm jedoch zieht lieber folgende Reihnefolge vor:
start() - Berechnung starten (der Button sieht weiterhin "gedrueckt" aus??!!!)
progresspanel wird rot (DANACH!!!)
butOptions[1] wird disabled
butOptions[1] wird wieder enabled
progresspanel wird wieder gruen

Ich denke, dass es was mit der Aktualisierung der Anzeige, zu tun hat - aber wie kann ich den gedrueckten Button wieder enddruecken und ihn eben disablen, das Panel rot werden lassen und VOR der Berechnung???

So sieht das daemlich aus!!!
Mein Code dazu:
Code:
// butOption ist ein Array von drei Buttons
//... for Schleife fuer die drei Buttons..., dann ActionListener fuer jeden innerhalb der Schleife
			butOptions[cnt].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent ae){
					if((ae.getSource()).equals((JButton) butOptions[0])){
						System.exit(0);

					}else if((ae.getSource()).equals((JButton) butOptions[1])){
						progresspanel.setBackground(Color.RED); // wenn dieser Button gedrueckt wird sollte dader Button passiv werden und ein Panel auf rot gesetzt werden
						butOptions[1].setEnabled(false);

						start();

					}else if((ae.getSource()).equals((JButton) butOptions[2])){
						StdDialog.setDefaultLookAndFeelDecorated(true);
						StdDialog hf = new StdDialog(lang.getSzHelpHeader(), lang.getSzInstructions());
					}
				}
			});

//... nach der Schleife haeng ich ein gruenes Panel ein
		progresspanel = new JPanel();
		progresspanel.setBackground(Color.GREEN);
		this.add(progresspanel);

//... in der Funktion start() wird eine Berechnung durchgefuehrt
	protected void start(){
		System.out.println("ButtonArrayPanel::start() - start");// zeigt mir dass die Funktion begonnen wurde
		sg.process(lang); // hier werden Daten geladen, berechnet und wieder gespeichert

		butOptions[1].setEnabled(true); // soll den Button wieder enablen und das nun rote Panel wieder auf gruen setzen
		progresspanel.setBackground(Color.GREEN);
		
		System.out.println("ButtonArrayPanel::start() - end");//
	}
//...
 

Corcovado

Bekanntes Mitglied
hm, ok, hab ich gemacht nun hab ihc folgende Kombinationen durch:
Code:
					progresspanel.setBackground(Color.RED);
						progresspanel.validate();
						progresspanel.revalidate();
						progresspanel.repaint();
						
						progresspanel.setBackground(Color.RED);
						progresspanel.revalidate();
						progresspanel.repaint();
						progresspanel.validate();

						progresspanel.invalidate();
						progresspanel.setBackground(Color.RED);
						progresspanel.validate();
						progresspanel.repaint();

						progresspanel.setBackground(Color.RED);
						progresspanel.invalidate();
						progresspanel.validate();
						progresspanel.repaint();

						progresspanel.setBackground(Color.RED);
						progresspanel.repaint();

						progresspanel.setBackground(Color.RED);
						progresspanel.validate();

						progresspanel.invalidate();
						progresspanel.setBackground(Color.RED);
						progresspanel.validate();
						progresspanel.revalidate();
						progresspanel.repaint();

etc. pp. Ausserdem hab ich nun auf dieser Seite nachgeschaut http://java.sun.com/j2se/1.5.0/docs/api/ (unter Container) und hier: http://mindprod.com/jgloss/repaint.html , was ich unter anderem auch versucht habe und der Nachmittag is auch vorbei. Nix geht - kann mir vllt jemand mit etwas Code aushelfen, Danke?
Wo liegt mein Fehler??!!!
 

Corcovado

Bekanntes Mitglied
tja das hab ich gestern Nacht versucht - das is imo das gleiche Problem. Daher wollte ich es zunaechst einfach angehen, zuerst gruen, dann rot und dann wieder gruen.
Ich denke schon, dass es an diesem validate/redraw Dreck liegt, aber man muss halt wissen wie man das macht oder einmal gemacht haben. Ich haeng da im Moment und das sollte eigentlich nur so nebenbei vllt auch funktionieren... :roll:
 

dyrathror

Mitglied
Also ein validate() oder revalidate() stößt das Layouting Deiner Komponenten neu an. Sinnvoll wenn man zwischendrin mal ein paar neue Komponenten ins Panel tut oder entfernt.

Ein repaint() (ohne alles) erzeugt im Endeffekt einen PaintEvent in der AWT.EventQueue, der asynchron zum Programm abgearbeitet wird wenn es mehrere Threads gibt.

Schon daran gedacht, daß Du Deine Arbeit auch im AWT Thread erledigst und deshalb das repaint() erst dran ist, wenn Deine Rechnerei erledigt ist? Das repaint() funktioniert wie ein SwingUtilities.invokeLater() für das refreshen Deines Views und die start() methode wird zuerst erreicht, da das updaten Deines Progressanzeigers ja hinten angehängt wurde.

Gruß
Stephan
 

Corcovado

Bekanntes Mitglied
Hm - Gut, Danke fuer die Erklaerung. Das Programm geht immer noch nicht!

Also ein validate() oder revalidate() stößt das Layouting Deiner Komponenten neu an. Sinnvoll wenn man zwischendrin mal ein paar neue Komponenten ins Panel tut oder entfernt.
Bei mir nicht, mein Layout Manager scheint wohl gerade im Urlaub zu sein.
Was zwischendrin (vom Programmtext her!!!) ist wuerde mich ja gerade interessieren, vor validate(), nach validate() im Wort validate() ??!!!

Ein repaint() (ohne alles) erzeugt im Endeffekt einen PaintEvent in der AWT.EventQueue, der asynchron zum Programm abgearbeitet wird wenn es mehrere Threads gibt.
Was asynchron zum Programm heissen soll, kann ich mir nicht vorstellen.

Schon daran gedacht, daß Du Deine Arbeit auch im AWT Thread erledigst und deshalb das repaint() erst dran ist, wenn Deine Rechnerei erledigt ist? Das repaint() funktioniert wie ein SwingUtilities.invokeLater() für das refreshen Deines Views und die start() methode wird zuerst erreicht, da das updaten Deines Progressanzeigers ja hinten angehängt wurde.
Was invokeLater bewirkt weiss ich nicht, da les ich mich grad ein. Ich weiss, dass man das bei ner Progressbar braucht und das Swing nicht "threadsicher" ist und man mit invokeLater eine synchrone Abarbeitung garantieren kann. Is aber alles etwas vage, weil ich nicht genau weiss was invokeLater macht und wie man das aufbaut - ich wollte eigentlich auch was ganz anderes mit dem Programm machen und das nur erst mal irgendwie hinbekommen, damit ich mich da mehr mit beschaeftigen kann, wenn ich mehr drueber weiss.
Also muss ich den "Progressanzeiger" wohl vorher reintun?! kA - es nervt, vielleicht isses ja zu komplex in einem Forum unter Anfaengerfragen dementsprechend zu erklaeren oder ne Antwort zu bekommen die mir hilft mein daemliches Programm so laufen zu lassen wie's soll, werd mich mal nachm Tutorial umsehn und das nachlesen, wenn ich Zeit hab, so bringt mir das nix.
Macht nix, Danke trotzdem.


Ich hab jetz noch das ausprobiert:
Code:
progresspanel.validate();
progresspanel.setBackground(Color.RED);

progresspanel.validate();
progresspanel.setBackground(Color.RED);
progresspanel.repaint();

progresspanel.validate();
progresspanel.setBackground(Color.RED);
progresspanel.revalidate();
progresspanel.repaint();

//...
 

dyrathror

Mitglied
Versuchs doch mal so:

Code:
package simpletest;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JToolBar;
import javax.swing.WindowConstants;


public class Test extends JFrame {
	
	protected JButton button;
	protected JProgressBar progress;
	
    public Test () {
		super("Test");
		this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		this.setBounds(200, 200, 500, 600);
		this.init();
    }

	protected void init() {
		this.getContentPane().setLayout(new BorderLayout());
		
		JToolBar toolbar = new JToolBar();
		
		this.button = new JButton(new AbstractAction("start working") {
			public void actionPerformed(ActionEvent event) {
				startWorking();
			}
		});
		
		toolbar.add(this.button);
		toolbar.add(Box.createHorizontalStrut(10));
		
		this.progress = new JProgressBar(0, 100);
		toolbar.add(this.progress);
		
		this.getContentPane().add(toolbar, BorderLayout.NORTH);
		this.getContentPane().add(new JPanel(), BorderLayout.CENTER);
		
	}
	
	protected void startWorking() {
		Thread worker = new Worker();
		worker.start();
	}
	
	private class Worker extends Thread {
		public void run() {
			System.out.println("start working ...");

			for (int ii = 0; ii < 101; ii++) {
				progress.setValue(ii);
				this.work();
			}
			
			System.out.println("... end working");
		}
		
		private void work() {
			try {
				Thread.sleep(100);
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		}
	}
	
    public static void main ( String [] args ) {
	    Test tt = new Test();
	    tt.setVisible(true);
    } 
}
 

Corcovado

Bekanntes Mitglied
Danke - aber trotzdem, ich muss da echtn Tut ueber Threads in Java durchmachen. Da fehlt mir total das Verstaendnis, was Java da im Hintergrund eigentlich genau macht. Die Erklaerungen finde ich esotherisch und verstehe so gut wie nix.

Mein Problem mit der Progressbar (ich hab da son Beispiel hier im Forum gefunden) war auch, dass man glaub ich nen start und end Wert fuer die Progressbar oder eben den "Progress" angeben/setzen muss, der dann in nem Thread parallel abgefragt wird. Naja ich hab nen Haufen laufen als "die Berechnung" da haengen schon allein einige Objekte zusammen, die verschiedene Dinge nacheinander machen, ich muss also irgendwo ne Statusvariable mal erzeugen und diese dann nach den einzelnen Schritten aktualisieren und abfragen lassen, dazu kommen aber eben auch andere Probleme, die mom vorgehn - da bleibt noch etwas Zeit um mich da einzulesen, denke ich :)

PS bin immer offen fuer Empfehlungen (solange es keine 300 Seiten Hardcore Threadsspezifikationen Java sind - eher so "Threads in Java fuer dummys - online")!
 

dyrathror

Mitglied
Du brauchst bei Threadprogrammierung eigentlich erst einmal nur 3 Dinge zu beachten.

1.) Der Thread in dem Du startest ist per default der AWT Thread.
2.) Gemalt wird immer nur im AWT Thread, nie in einem anderen!
3.) Deshalb versuchen die Arbeit von einem anderen Thread erledigen zu lassen.

Wie das geht kannst Du meinem Beispiel entnehmen.
Und das war's auch schon.

Für alles andere (Hardcore Thread programming) gibt es in erster
Linie die Java Language Specification v2, und das Buch "Concurrent
programming in Java" von Dough Lea.

Gruß
Stephan
 

Corcovado

Bekanntes Mitglied
also die Ueberschrift meines Threads is ja durchaus nun beantwortet - obwohl mich dann doch endlich interessiert haette wie ich denn nun mein Schrottprogramm endlich hinbekommen - nun, hab ich wieder etwas gelesen und werde mal zumindest ne Loesung posten, die ich bis jetzt gefunden hab:
Code:
	protected void start(){
        Thread startCalculation =new Thread(){
	        public void run(){
                        System.out.println("ButtonArrayPanel::start() - start");
                        progresspanel.setBackground(Color.RED);
                        butOptions[1].setEnabled(false);
                        pcg.process(lang);
                        progresspanel.setBackground(Color.GREEN);
                        butOptions[1].setEnabled(true);
                        System.out.println("ButtonArrayPanel::start() - end");//
                }
        };        
        startCalculation.start();
	}
...und aus dem actionListener rufe ich eben die Methode start() auf, das wars. Ging also nun auch ohne validate(), invalidate(), revalidate(), repaint() - wobei mich das nun wiederum wundert. Gibts etwa ne zweite Loesung mit diesen Funktionen oder sollte ich die auf jeden fall noch einbauen?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Mein Programm läuft bei der ersten Eingabe nicht mehr weiter, woran liegt das? Java Basics - Anfänger-Themen 6
J Mein Java Programm lässt sich nicht mehr bearbeiten Java Basics - Anfänger-Themen 2
sserio Wieso funktioniert mein Programm nicht Java Basics - Anfänger-Themen 2
J Nach dem Exportieren funktioniert mein Programm nicht mehr Java Basics - Anfänger-Themen 8
P Mein Programm wird zwar erfolgreich Compiliert, öffnet sich aber nicht Java Basics - Anfänger-Themen 6
J Kann ich mein Programm so schreiben? Java Basics - Anfänger-Themen 4
T Mein Programm hat Fehler Java Basics - Anfänger-Themen 4
J Mein Programm beendet sich ohne mein Zutun Java Basics - Anfänger-Themen 9
x-tshainge Mein Programm lässt sich nicht Starten Java Basics - Anfänger-Themen 8
W Warum läuft mein Programm nicht? Java Basics - Anfänger-Themen 14
W Warum funktioniert mein Programm nicht ? Java Basics - Anfänger-Themen 12
W Warum funktioniert mein Programm nicht ? Java Basics - Anfänger-Themen 6
W Erste Schritte Warum funktioniert mein Programm nicht ? ~if Anweisung~ Java Basics - Anfänger-Themen 4
A Erste Schritte Mein Programm erkennt die variable EinAus.readInt nicht Java Basics - Anfänger-Themen 15
N Warum terminiert mein Programm nicht? Java Basics - Anfänger-Themen 13
G Wie kann ich mein Quellcode als Programm vom desktop starten? Java Basics - Anfänger-Themen 1
P Wie kann ich mein Programm zu einer App umwandeln? Java Basics - Anfänger-Themen 4
M Mein erstes Programm Java Basics - Anfänger-Themen 3
A Mein 1x1 Programm funktioniert nicht? Java Basics - Anfänger-Themen 2
M Mein erstes Java Programm Java Basics - Anfänger-Themen 5
A Wie kann ich mein Programm noch effizienter machen? Java Basics - Anfänger-Themen 1
H Kann ich mein Programm vereinfachen? Java Basics - Anfänger-Themen 3
1 Mein erstes Programm, HELP!! Java Basics - Anfänger-Themen 2
D Mein erstes Programm flackert Java Basics - Anfänger-Themen 5
H Ich kann mein Java Programm Test.class nicht ausführen Java Basics - Anfänger-Themen 6
K Mein Programm... Heute: Settings-Datei in .jar speichern und auslesen Java Basics - Anfänger-Themen 9
M Kann mein Java Programm nicht starten Java Basics - Anfänger-Themen 6
B Methoden Mein erstes Programm - und gleich Probleme Java Basics - Anfänger-Themen 6
O Warum terminiert mein Programm nicht!? Java Basics - Anfänger-Themen 15
M Sammlung von Anfängerfragen für mein erstes Programm Java Basics - Anfänger-Themen 15
H wie bekomm ich ein Foto in mein Programm rein? Java Basics - Anfänger-Themen 8
M Mein Externes Programm startet nicht Java Basics - Anfänger-Themen 13
F Exception verweist nicht auf mein Programm Java Basics - Anfänger-Themen 10
F Wie benutze ich mein java programm ohne editor? Java Basics - Anfänger-Themen 2
B Ich kann mein Java Programm net Kompilieren? Java Basics - Anfänger-Themen 8
J Kann mein Programm nicht Kompilieren? Java Basics - Anfänger-Themen 9
B Text von Knuddels Chatfenster in mein Programm bringen? Java Basics - Anfänger-Themen 5
L Suche Verbesserungsvorschläge für mein erstes Programm Java Basics - Anfänger-Themen 34
Bierhumpen mein erstes großes Programm. Was ändern? verbessern? Java Basics - Anfänger-Themen 12
M Ich und mein Programm. am verzweifeln ^^ Java Basics - Anfänger-Themen 7
A Mein erstes Programm Java Basics - Anfänger-Themen 6
0 ActionListener zerstört brutal mein Programm (als .jar) ! Java Basics - Anfänger-Themen 9
B Könnt ihr ein Auge auf mein Programm werfen? Java Basics - Anfänger-Themen 8
D Mein kleines Programm etwas schöner machen :-) Java Basics - Anfänger-Themen 13
M BufferedReader bricht mein programm ab => hilfe Java Basics - Anfänger-Themen 2
A Warum wird mein jdk nicht gefunden? Java Basics - Anfänger-Themen 3
J Layout Manager, welcher ist der Richtige für mein Program? Java Basics - Anfänger-Themen 1
dennis_lnz Klassen Wie kann ich mein Java Textadventure verbessern, um ein Klassendiagramm zu erstellen? Java Basics - Anfänger-Themen 9
J Größter gemeinsamer Teiler: mein Code Java Basics - Anfänger-Themen 6
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
Alen123 Warum funktioniert mein Code nicht? Java Basics - Anfänger-Themen 64
sserio Wieso funktioniert mein TableView nicht /JavaFX. Java Basics - Anfänger-Themen 4
M Mein quellcode wird nicht in der Konsole ausgegeben Java Basics - Anfänger-Themen 3
W Wie ziehe ich von einer bestimmten Zahl, Zahlen ab, bis mein Ergebnis null beträgt? Java Basics - Anfänger-Themen 10
S Mein erstes eigenes Projekt - Aufbau und Strukturierung Java Basics - Anfänger-Themen 6
A Java die richtige Programmiersprache für mein Projekt? Java Basics - Anfänger-Themen 1
S Brauche hilfe in Java [Fehler in mein Code]? Java Basics - Anfänger-Themen 2
S Wie ende ich mein Pogrammierung? [Hilfe] Java Basics - Anfänger-Themen 1
R Mein Plugin funktioniert nicht? Java Basics - Anfänger-Themen 10
A Eine Krone in der Textausgabe - Mein Code Java Basics - Anfänger-Themen 11
M Warum berechnet mein Primzahlenprog zu hohe Zahlen nicht? Java Basics - Anfänger-Themen 20
M OOP Mein erstes Textadventure... Java Basics - Anfänger-Themen 3
G Mein Java Projekt funktioniert nicht Java Basics - Anfänger-Themen 5
W Wieso funktioniert mein Switch Case nicht ?! Java Basics - Anfänger-Themen 9
L Mein Taschenrechner lässt sich plötzlich nicht mehr öffnen Java Basics - Anfänger-Themen 5
W Ist mein Struktogram richtig erstellt worden? Java Basics - Anfänger-Themen 4
G Input/Output Wo liegt mein Fehler? Java Basics - Anfänger-Themen 4
G Variablen Was ist mein Fehler? Java Basics - Anfänger-Themen 2
C Warum funktioniert mein If Statement nicht richtig? Java Basics - Anfänger-Themen 18
B Drucken: Default Paper von Drucker? Mein Drucker druckt falsch Java Basics - Anfänger-Themen 3
W Compiler-Fehler Fehler - <identifier> expected, wo liegt mein Fehler? Java Basics - Anfänger-Themen 4
stylegangsta Input/Output Hat eclipse eine Macke oder mein Code Array Datei einlesen Java Basics - Anfänger-Themen 5
S Wieso wird mein JFrame transparent dargestellt? Java Basics - Anfänger-Themen 5
N mein RegEx Java Basics - Anfänger-Themen 2
N Mein Bubblesort sortiert mein Array nicht Java Basics - Anfänger-Themen 2
W Wie hat mein Lehrer das gemacht. Java Basics - Anfänger-Themen 2
Z Klassen Warum wird mein Objekt nicht erkannt? Java Basics - Anfänger-Themen 2
J Erste Schritte Zweithöchster Wert eines Arrays herausfinden - warum klappt mein Code nicht? Java Basics - Anfänger-Themen 3
C Mein Video zu Java Grundlagen Java Basics - Anfänger-Themen 8
T Eclipse kennt mein Button nicht... Java Basics - Anfänger-Themen 5
J Wo liegt nur an dieser einfachen Bedingung mein Fehler? Java Basics - Anfänger-Themen 8
E Mein eigener Listener (Hilfe gesucht) Java Basics - Anfänger-Themen 2
D Brauche Hilfe für mein übungsprogramm Java Basics - Anfänger-Themen 16
T Mein String in ein JLabel stecken Java Basics - Anfänger-Themen 2
T mein erstes Java projekt Java Basics - Anfänger-Themen 8
J Methoden Wo ist mein Fehler ?! Java Basics - Anfänger-Themen 9
R .txt in mein Javaprogramm hineinschmelzen Java Basics - Anfänger-Themen 6
T OOP Mein erstes Java-Spiel - Schiffe versenken! Java Basics - Anfänger-Themen 2
E Mein erstes Java Projekt - Sauberer code? Java Basics - Anfänger-Themen 28
S Mein Code is unübersichtlich - besseren Stil Java Basics - Anfänger-Themen 6
H Probleme mein Ausführen der .class (Ubuntu JDK6) Java Basics - Anfänger-Themen 2
M Mein TableEvent problem Java Basics - Anfänger-Themen 3
C Boolsche Ausdrücke - Wo ist mein Fehler? Java Basics - Anfänger-Themen 14
propra Wie mache ich einem JPanel mein bereits instanziertes Model bekannt Java Basics - Anfänger-Themen 9
M Warum wird mein Icon bei den JTree Nodes nicht angezeigt? Java Basics - Anfänger-Themen 7
V Mein erster Konstruktor Java Basics - Anfänger-Themen 3
S GaussJordan in Java, wo liegt mein Fehler? Java Basics - Anfänger-Themen 4
U2nt Mein Chat Java Basics - Anfänger-Themen 10
S Wo ist mein Fehler? Java Basics - Anfänger-Themen 2
I OOP This-Referenzs > wo liegt mein Denkfehler? Java Basics - Anfänger-Themen 24

Ähnliche Java Themen

Neue Themen


Oben