Wie mach ich, das mein Button schneller reagiert.

Status
Nicht offen für weitere Antworten.

anfänger

Mitglied
hallo leute,
ich habe ein Programm geschrieben in der mehrere Figuren auf einer Karte laufen.
wenn ich das programm starte, dauert es ne ein paar sekunden bis es startet, da erstmal die startpositionen aus einer Datei eingelesen werden müssen. Danach lese ich die neuen Koordinaten aus einer anderen Datei immer dann aus, wenn ich sie brauche, da sonst bei größeren DAteien eine OutOfMemoryException geworfen wird. Das ganze funktioniert auch wunderbar und die figuren laufen auch flüssig ohne probleme über das Feld.
Mein problem beginnt erst, wenn ich scrolle, einen Button, an der slidbar einen wert verändere oder eine neue datei mit andern startkoordinaten öffnen will. Das programm reagiert zwar richtig, aber die reaktionen kommen teilweise erst eine halbe minute später.
Wie schaff ich es, dass beispielsweise mein button gleich auf die aktion reagiert und keine großen wartezeiten auftreten?
 

mic_checker

Top Contributor
Um ne genauere Diagnose machen zu können bräuchte man wohl deinen Quellcode.

Die Probleme treten auf sobald du "den normalen Programmfluss störst" und anfängst zu scrollen etc. pp. ?
 

anfänger

Mitglied
genau, das Problem taucht erst auf, wenn ich den normalen Programmfluss störe, wie zum Beispiel klicken auf einen Button. Das mit den Programmcode ist keine schlechte idee, aber es ist nicht gerade wenig. soll ich das nicht lieber irgendwo hin schicken?
 

anfänger

Mitglied
nein, im moment nicht. ich weiß auch nicht wohin mit den threads, da ich aus der datei ja immer nur eine bestimmte anzahl von zeilen auslese.

aber ich merk schon, der code ist wohl doch angebracht. aber ist nicht unbedingt übersichtlich.

hier der Code, der die Datei ausliest:
Code:
public String[] proto_lesen()
{
	String[] daten = new String[7];
	try{
		String tmp = br.readLine();
	
		if(tmp.equals(""))
			daten = null;
		else{
			StringTokenizer token = new StringTokenizer(tmp, "\t");
			
			 for(int i = 0; i<7&&token.hasMoreTokens();i++) {
                		        daten[i]=token.nextToken();
	                 	 }
		}
	}catch(IOException io){System.err.print(io.toString());}
	return daten;
}
hier werden die neuen Koordinaten für in die Liste mit den eingetragen
Code:
public static void aktualisieren(ArrayList[] liste)
{
   	for(int i = 0, len = liste[0].size();i<len;i++)
    	{
    		int ref = Integer.parseInt((String)liste[5].get(i));
    		String typ = (String)liste[2].get(i);
    		for(int j = 0,l= Karte.zeichenDaten.length; j<l; j++)
    		{
    			if(ref == Karte.zeichenDaten[j][0])
    			{
    				if(typ.equals("BW"))
    				{
	    				String tmp = (String)liste[6].get(i);	//Ort
	    				int tmpO = Integer.parseInt(tmp.substring(3, 10));
	    				int tmpN = Integer.parseInt(tmp.substring(10, 17));
	    				    				
	    				Karte.zeichenDaten[j][9] = (int)((tmpO -  xy[1][0]) * 0.141);
	    				Karte.zeichenDaten[j][10] = (int)((tmpN - xy[1][1]) * 0.141);
	    			}
    				else if(typ.equals("VE"))
    				{
    					Karte.zeichenDaten[j][9] = 0; 
    					Karte.zeichenDaten[j][10] = 0;
    				}
    				break;
    			}
    		}
    	}
    }
in dieser Klasse werden die Methode zum Einlesen aufgerufen:
Code:
public class Timer extends Thread implements Runnable {
   private SimpleDateFormat format = new SimpleDateFormat ("dd.MM.yyyy '   ' HH:mm:ss");
   static int warte = 0;
   
  public Timer () {
  }

  private void setzteAktuelleZeichenkoords()
  {
  	String []tmp_array;
  	Einlesen einlesen = new Einlesen(Karte.fileName);
  	
  	
  	tmp_array = einlesen.proto_lesen();
  	do{
  		if(isInterrupted())
			break;
  		
  		ArrayList[] liste = new ArrayList[tmp_array.length];
  		for(int i = 0; i< tmp_array.length; i++)
  			liste[i] = new ArrayList();
  		
  		for(int i = 0; i< tmp_array.length; i++)
  			liste[i].add(tmp_array[i]);
  		
  		String ref_time = tmp_array[0]+tmp_array[1];
  		Karte.datum = tmp_array[0];
  		Karte.uhr = tmp_array[1];
  		
  		Timestamp time1 = parse_time(ref_time);
  		
  		tmp_array = einlesen.proto_lesen();
  		while(ref_time.equals(tmp_array[0]+tmp_array[1]))
  		{
  			for(int i = 0; i< tmp_array.length; i++)
  	  			liste[i].add(tmp_array[i]);
  	  		tmp_array = einlesen.proto_lesen();
  		}
  		Auswerten.aktualisieren(liste);
  		Timestamp time2 = parse_time(tmp_array[0]+tmp_array[1]);
  		long time_diff = time2.getTime()-time1.getTime();
  		
  		Karte.panel.repaint();
  		
  		if(!Karte.stop)
		{
			try{
				sleep(Karte.slid_val*(time_diff/3)); 
			}catch(InterruptedException e){System.err.print(e.toString());}
		}
  		
  	
  	}while(!tmp_array[0].equals("")&&(!Karte.stop));
  		
  }
  
	
	
	protected static Timestamp parse_time(String datum)
	{
		int[] date = {
			Integer.parseInt(datum.substring(0, 2)),
			Integer.parseInt(datum.substring(3, 5)),
			Integer.parseInt(datum.substring(5, 7)),
			Integer.parseInt(datum.substring(8, 10)),
			Integer.parseInt(datum.substring(11, 13))
		};
		
		Timestamp time = new Timestamp(2004, date[1], date[0], date[2], date[3], date[4], 0);

		return time;
	}	
  public void run() 
  {
  	while(!Karte.replayEnde){
  		if(Karte.start)
  			setzteAktuelleZeichenkoords();
  	}
  }

und hier die Implementierung der Buttons
Code:
private void setButtons(Container c)
	{
		/**
		 * Größe und Lage der drei Buttons wird festgelegt.
		 */
		button_stop.setBounds(winX-90, 20, 75, 25);
		button_restart.setBounds(winX-170, 50, 100, 25);
		button_start.setBounds(winX-170, 20, 75, 25);
		
		button_stop.setEnabled(false);
		button_restart.setEnabled(false);
		button_start.setEnabled(false);
		
		/**
		 * Definition der einzelnen ActionListener der jeweiligen Buttons.
		 */
		button_stop.addActionListener(new ActionListener(){
			
			public void actionPerformed( ActionEvent  e)
			{
				String action = e.getActionCommand();
				
				//Auswaehlen des Menu-Items "Open"
				if(e.getActionCommand().equals("STOP"))
				{			
					button_start.setSelected(false);
					button_stop.setSelected(false);	
					button_restart.setEnabled(true);
					button_start.setEnabled(false);
					button_stop.setEnabled(false);
					stop= true;
				}
			}
		});
				
		button_restart.addActionListener(new ActionListener(){
			public void actionPerformed( ActionEvent  e)
			{
				String action = e.getActionCommand();
				
				//Auswaehlen des Menu-Items "Open"
				if(e.getActionCommand().equals("RESTART"))
				{	
					button_restart.setSelected(false);
					button_stop.setEnabled(true);
					button_start.setEnabled(false);
					button_restart.setEnabled(false);
					stop= false;
				//	restart = true;
				}
			}
		});
				
		button_start.addActionListener(new ActionListener(){
			public void actionPerformed( ActionEvent  e)
			{
				String action = e.getActionCommand();
				
				//Auswaehlen des Menu-Items "Open"
				if(e.getActionCommand().equals("START"))
				{
					button_stop.setSelected(false);
					button_start.setSelected(false);
					button_stop.setEnabled(true);
					button_start.setEnabled(false);
					button_restart.setEnabled(false);
					start= true;
					stop = false;
				}
			}
		});
		
		/**
		 * Anhängen der Implementierten Buttons an den Container c.
		 */
		c.add(button_stop);
		c.add(button_restart);
		c.add(button_start);
	}

ich hoffe ihr könnt mit der Menge was anfangen.
und vielleicht sieht auch einer meinen Fehler.

Ich hab auch noch eine Frage.
ich zeichne meine Karte, die im hintergrund liegt zusammen mit den figuren auf ein und dasselbe Panel. dadurch muss die karte aber auch immer aktualisiert werden, sich eine Firgur bewegt. Da sie aber nur neu gezeichnet werden müsste, wenn gescrollt wird, wollte ich fragen, wie ich das umsetze mit zwei panels und die beiden dann in ein JScrollPanel einfügen. muss ich für hintergrund(karte) und Vordergrund(für figuren) zwei klassen machen die von JPanel erben und die beide in ein drittes Panel einfügen, welches ich dann ohne probleme in mein JScrollPane einfügen kann?
 

Maddy

Mitglied
Ich hab vor einigen Jahren mal was ähnliches programmiert, ich liefere Dir mal ein paar Stichworte, mit denen Du hoffentlich etwas anfangen kannst.

1. die statische Karte in ein JPanel, wie Du es schon hast, darüber ein GlassPane, auf dem alle beweglichen Teile gezeichnet werden (Figuren). Spart das neu zeichnen der Karte.

2. Threads. Du kannst hier sicher einiges parallelisieren. Zum Beispiel würde ich die Ereignisbehandlung (also scrollen, Button drücken etc) jeweils über eigene Threads abwickeln. Dann wird der normale Programmfluss nicht unterbrochen.
Auch das Datei auslesen kann parallel ablaufen.

Ich denke, das sollte die Sache performanter machen. Ob dann schon alle Probleme gelöst sind, wage ich jetzt mal zu bezweifeln, Java ist einfach langsam in solchen Sachen, aber ein Anfang sollte gegeben sein.

Gruss Maddy
 

anfänger

Mitglied
ich weiß aber nicht, wie ich das scrollen und button drücken parallelisieren soll. wie soll denn sowas gehen. ich weiß auch nicht wie ich das einlesen paralelisiern soll, da ich doch immer nur einen teil der datei auslese und nie alles. oder soll ich das aktualisieren der alten daten mit den neu eingelesenen daten über threads abwickeln?
 

AlArenal

Top Contributor
Wenn das Ding ununterbrochen auf der Platte rödelt, würde ich es in die Tonne treten. ;) Dauerleuchten der HDD-LED macht mich schwer nervös..
 

anfänger

Mitglied
ich vertseh zwar nicht, was du da von dir gibst, aber das muss ich ja auch nicht, da es bestimmt nix mit meinem problem zu tun hat
 

Maddy

Mitglied
ich meine, dass Dein Hauptprogramm Threads starten soll, die schlafen bis sie gebraucht werden. Also wenn jemand einen Button drückt, weckt das Programm den Thread, der die Behandlungsroutine für den Buttonklick kennt und diese Arbeit erledigt. Wenn er fertig ist, geht er wieder schlafen, und Dein Hauptprogramm lässt derweil weiter die Männchen hüpfen.

Werden neue Daten aus der Datei benötigt, muss Dein Hauptprogramm einen anderen Klingelzug betätigen und den Thread aus dem Bett holen, der weiss, was jetzt zu tun ist.

usw.

Ich gehe mal davon aus, dass Du bestenfalls mal etwas von Threads gehört, sie aber nie selbst verwendet hast? Jetzt wäre ein guter Zeitpunkt damit anzufangen ;)

http://www.java-forum.org/de/viewtopic.php?t=15778
Das sind zwei Tutorials hier aus dem Forum, ich hab sie mir nicht angesehen, aber für einen Überblick reicht es garantiert, sonst wären sie nicht hier. Schau sie Dir mal an, spiele ein bischen damit herum, und wenn Du es einigermassen verstanden hast, reden wir weiter, einverstanden?

P.S. wenn ich Dir jetzt zu nahe getreten bin, bitte ich um Verzeihung, es liegt keinesfalls in meiner Absicht, Dich zu beleidigen.

Gruss Maddy
 

anfänger

Mitglied
ich hab das einlesen der datei vorher in einem rutsch bearbeitet und dies mit einem thread eher schlecht als recht gelöst. aber da der speicher für dateien ab 5MB nicht mehr ausreicht, hab ich es umgeschrieben.

werd mir das mit den threads aber auf jeden fall mal ansehen
 
G

Guest

Gast
Ich würde das umgekehrt machen, die männchen durch einen thread laufen lassen und den Rest im Hauptprogramm machen. Vorteil:
Man brauch die Ereignislistener der ScrollPanes und so nicht umschreiben!
 

anfänger

Mitglied
ich habe schon mal versucht den hintergrund in einem thread auf zu bauen, da ich denke, dass das dieser bildaufbau beim scrollen eine menge zeit braucht. denn der hintergrund setzt sich auf 5*6 Bitmaps zusammen die je 256*256 Pixel groß sind. die Information, welches pixel welche farbe hat, muss ich nämlich zusätzlich auslesen. aber das scheint bei mir nicht so ganz hinzuhauen, denn er scheint dann die felder des Arrays für die Pixel durcheinander zu setzen und damit kommt kein vernünftiges Bild raus. weiß jemand voran das liegt und wie ich das verhindern kann?
 

EgonOlsen

Bekanntes Mitglied
30Sek. Wartezeit bei Knopfdrücken (so habe ich das jedenfalls verstanden) wirst du auch mit Threads nicht beseitigen können. Da liegt irgendwas anderes im Argen...aber mal was allgemeines, zumal viele Probleme in diesem Forum direkt oder indirekt damit zusammenzuhängen scheinen: KEINE Threads für Spiellogik verwenden, wenn es sich irgendwie vermeiden lässt. Für IO (Netzwerk, Platte usw): ja! - Für die AI in einem Schachspiel (oder sonstiges, wo die Züge lange dauern können): Vielleicht! - Aber nicht für das Bewegen von Spielfiguren, Kollisionsabfragen und sonstiges. Das gilt auch für implizite Threads wie z.B. den AWTEvent-Thread. D.h. mit anderen Worten: Ein Klick auf einen Button sollte ein Flag setzen, welches im Hauptthread ausgewertet und behandelt wird. Die Änderung (z.B. Bewegen der Spielfigur) sollte nicht direkt im Listener gemacht werden. Denn entweder muss man dann viel synchronisieren oder man bekommt lustige Seiteneffekte, die je nach Hardware, OS und VM mal gar nicht und mal extrem auffallen können.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
R Erste Schritte Object reference funktioniert nicht. Wie mach ichs richtig? Allgemeine Java-Themen 3
M Google Guice (Assisted Injects) - Buggy oder mach ich's falsch? Allgemeine Java-Themen 5
M interaktive grafische Oberfläche - wie mach ich das am Besten Allgemeine Java-Themen 4
TheJavaKid *GGRRR* was mach ich falsch >:( Allgemeine Java-Themen 3
flashfactor Wie mach ich das? Allgemeine Java-Themen 3
P Priorität einen Programms erhöhen, wie mach ich das? Allgemeine Java-Themen 3
Queenman Interface Mein Microsoft Visual Studio Code zeigt komische Dinge & Menüs an Allgemeine Java-Themen 9
B Wie kann ich mein 8 Klassen Gebilde objektorientierter schreiben? Allgemeine Java-Themen 114
Tiago1234 Warum hängt sich mein Programm auf? Allgemeine Java-Themen 22
J Mein Frame friert ein beim Uploaden Allgemeine Java-Themen 4
Drachenbauer Wie sorge ich dafür, dass mein Spiel die ini-Datei in der Resourcen-ordner des Projektes schreibt? Allgemeine Java-Themen 5
I File ausführen und mein Programm bearbeiten lassen Allgemeine Java-Themen 11
M Brainstorming für mein Projekt Allgemeine Java-Themen 30
R Wo ist mein Fehler in der Methode DRINGEND Allgemeine Java-Themen 9
R Wo ist mein Fehler in diesem Code Allgemeine Java-Themen 7
M Suche aktuelle Apache Poi Bibliothek zum Einbinden in mein Programm Allgemeine Java-Themen 2
T log4j2 Wo liegt mein Logfile? Allgemeine Java-Themen 3
Thallius Warum läst mein replace die Klammern drin? Allgemeine Java-Themen 10
O Mein JButton Array funktioniert nicht Allgemeine Java-Themen 3
C Durch klicken von Button in GUI wird leeres Fenster geöffnet und nicht mein Spiel "Memory" Allgemeine Java-Themen 13
G Mein PDF Projekt mit iText Allgemeine Java-Themen 2
K Was ist mein Fehler? Allgemeine Java-Themen 2
itwestnet Mein Java-Programm läuft nicht in China Allgemeine Java-Themen 4
Thallius App-Sprache in der App ändern. Wo ist mein Denkfehler? Allgemeine Java-Themen 6
M Mein erstes TicTacToe :-) Allgemeine Java-Themen 3
A Applet Mein Applet verursacht Browserabsturz Allgemeine Java-Themen 8
Ollek MVC - Anwendung auf mein Projekt Allgemeine Java-Themen 18
K Wo ist mein Fehler? Allgemeine Java-Themen 21
J Mein eigener Messenger und dessen Probleme Allgemeine Java-Themen 48
C Hilfe! Mein Java mag nich mehr ganz... Allgemeine Java-Themen 11
F VideoIntro für mein Programm Allgemeine Java-Themen 2
A Wie lasse ich mein Programm als Daemon laufen? Allgemeine Java-Themen 4
A Wie liefere ich mein Java-Programm richtig aus? Allgemeine Java-Themen 10
G Entscheidungsproblem für mein Vorhaben, zwischen Java und C# Allgemeine Java-Themen 35
G Wie kann ich in mein Programm eine Updatefunktion einbauen Allgemeine Java-Themen 3
E Wie bekomme ich mein Image in das Fenster Allgemeine Java-Themen 2
V Beratung zum Bestimmen der "Mittel"(Java,Sql) mein Allgemeine Java-Themen 3
S mit welchem befehl kann ich mein programm autom. schließen Allgemeine Java-Themen 3
R Mein Applet läuft in der IDE aber nicht. Allgemeine Java-Themen 2
M Bitte Testen: Mein Multi-File Editor Allgemeine Java-Themen 30
B Fehler:Mein Applet kann nicht auf zwei txt-Dateien zugreifen Allgemeine Java-Themen 2
C Warum wartet mein thread nicht? Allgemeine Java-Themen 2
F Datei auslesen - wo ist mein Fehler? Allgemeine Java-Themen 9
T läuft mein Programm schon? - wie feststellen Allgemeine Java-Themen 6
T Warum mein such-tool schneller als Windows such-tool? Allgemeine Java-Themen 5
A mein Frame wird nicht schnell genung aktualisiert Allgemeine Java-Themen 7
G JFrame nimmt mein Image nicht Allgemeine Java-Themen 2
D Mein Bäumchen Allgemeine Java-Themen 6
B Wie erstelle ich dazu eine Abfrage ob der Button gedrückt wurde? Allgemeine Java-Themen 8
D Image bewegt sich nicht nach Klicken auf Button Allgemeine Java-Themen 15
N Value Wert aus HTML-Button mittels thymeleaf spring an java übergeben Allgemeine Java-Themen 2
N Apache POI/ neue Reihe in Excel mit einem Button Allgemeine Java-Themen 2
S Swing Speichern nach Button-Klick Allgemeine Java-Themen 5
E Problem mit Gridlayout und Button Allgemeine Java-Themen 2
M itext - Button der Text in Zwischenablage stellt Allgemeine Java-Themen 0
N Über einen Button in JavaFX ein Event über eine Pipeline schicken(Netty) Allgemeine Java-Themen 1
M JavaFX Button mit mehreren Aktionen? Allgemeine Java-Themen 7
G Drop down Button Menü (Combobox) Allgemeine Java-Themen 7
E Swing Buttons auf knopfdruck(anderer Button) erstellen Allgemeine Java-Themen 6
K Mit Button neue Klasse öffnen Allgemeine Java-Themen 9
4 Swing Durch klicken auf Button Labels einem Panel hinzufügen Allgemeine Java-Themen 4
C Classpath Neue Klasse über einen Button ausführen Allgemeine Java-Themen 3
C Auslesen auslösen über Button-Click Allgemeine Java-Themen 8
Tacofan Button nicht mehr anklickbar machen Allgemeine Java-Themen 8
L Nach Button drücken den Text festspeichern Allgemeine Java-Themen 9
J Java eigenen Button programmieren (ob Cursor im Rechteck ist oder nicht..../button pressed or not) Allgemeine Java-Themen 6
F Klassen Klasse bei Button klick öffnen Allgemeine Java-Themen 11
J JScrollPane und Button erscheinen nicht Allgemeine Java-Themen 13
L Label- & Textfelderzeugung durch Button Allgemeine Java-Themen 1
M for Schleife mit Swing Button abbrechen Allgemeine Java-Themen 7
B Button im Web klicken Allgemeine Java-Themen 4
C Java Excel Button Allgemeine Java-Themen 2
J Swing Eigenes Button-design Allgemeine Java-Themen 2
H WAV abspielen nach Button-Klick Allgemeine Java-Themen 4
G Button-Registrierung beim ActionListener erst NACH Tastendruck Allgemeine Java-Themen 2
M JavaFX-Gegenstück zu Swing-Button-DoClick-Methode Allgemeine Java-Themen 5
A Button drücken Allgemeine Java-Themen 3
S Thread anhalten per Button ? Allgemeine Java-Themen 3
D Dialog soll sich beim Klick auf Button schließen Allgemeine Java-Themen 8
M HTTP Selenium button klicken Allgemeine Java-Themen 2
K GUI-Button Inhalte vergleich - TicTacToe Grundriss Allgemeine Java-Themen 11
X Button während Thread aktiv ist disablen Allgemeine Java-Themen 11
C Button geben Fehlermeldung aus Allgemeine Java-Themen 5
R Klasse über Button Event in anderer Klasse informieren Allgemeine Java-Themen 11
R [Android]Wie dynamischen Button-Feld erstellen? Allgemeine Java-Themen 3
F WebBrowser Button automatisch drücken Allgemeine Java-Themen 5
L mit Button jar.Datei öffnen? Allgemeine Java-Themen 5
1 URL mit Button öffnen Allgemeine Java-Themen 29
L Thread stoppen über Button funktioniert nicht Allgemeine Java-Themen 7
ModellbahnerTT Button mit Zahlen beschriften Allgemeine Java-Themen 1
E JTidy html "hidden" Button drücken Allgemeine Java-Themen 7
G Button-Array überschreiben und dem Container zufügen? Allgemeine Java-Themen 2
G Icon auf Button Allgemeine Java-Themen 5
N Button Allgemeine Java-Themen 3
G Schleife durch Button beenden Allgemeine Java-Themen 6
G wenn Button geklickt -> regelmäßig Aktion ausführen Allgemeine Java-Themen 7
G default button für enter taste Allgemeine Java-Themen 3
T JTabbedPane nach Button-Klick wechseln Allgemeine Java-Themen 3
E Button disablen Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben