ActionEvent zur Steuerung von Text- und Bildauswahl

lokilay

Mitglied
Hallo Zusammen,
die Situation ist folgende: Innerhalb eines JFrames (f1) soll ein "Zurück-Button" ein vorherig angezeigtes Bild und gleichzeitig den vorherig dargestellten Text anzeigen. Dazu gibt es ein ImageIcon-Array und ein String-Array. Die Steuerung der Bilder klappt, Probleme gibt es wenn ich gleiches if-else (Zeile 72-78) für das String-Array hinzufüge. Wo liegt mein Fehler und wie könnte man ihn verbessern?

Java:
       public static void Anwendungsfenster()
	{
		 
		
		 //Bilder
		final ImageIcon[] iconarray = {
		     	new ImageIcon( "img/Folie1.png" ),
		     	new ImageIcon( "img/Folie2.png" ),
		     	new ImageIcon( "img/Folie3.png" ),
		     	new ImageIcon( "img/Folie4.png" ),
		     	new ImageIcon( "img/Folie5.png" ),
		     	new ImageIcon( "img/Folie6.png" ),
		     	
		     	};
	     final JLabel l  = new JLabel( iconarray[current] );
	     final JLabel zwei  = new JLabel( iconarray[current] );
	     
	    
		 final JFrame f1 =   new JFrame( "Fenster1");
		 final JFrame f2 =   new JFrame( "Fenster2" );
		 f1.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		 f2.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		 f1.setSize  ( 1024, 800 );
		 f2.setSize  ( 1024, 800 );
		 f1.setLayout( new FlowLayout() );
		 f1.setLayout( new FlowLayout() );
		 f1.setVisible( true );
		 f2.setVisible( true );
	 	 f1.add( l );
	 	 f2.add( zwei );
	 	 
	 
	 	//TextdateiInhalt zu Stringarray
	 	final File[] file = {
	 			new File("hinweis1.txt"),
	 			new File("hinweis2.txt"),
	 			new File("hinweis3.txt"),
	 			new File("hinweis4.txt"),
	 			new File("hinweis5.txt"),
	 			new File("hinweis6.txt"),
	 	};
	 	String hinweis;
	 	final String hinweisarray[] =  new String[156];
 		for (int i=0;i<file.length;i++)
 			
 			try {
 			    BufferedReader in = new BufferedReader(new FileReader(file[i]));
 			    while ((hinweis = in.readLine()) != null) {
 			    	hinweisarray[i] = hinweis;
 			    	
 			    }
 			    in.close();
 			} catch (IOException e) {
 			}
		
	 	 //Zurück-Button
 		 final JLabel hinweislabel  = new JLabel( hinweisarray[current] );
 		 final int i = 0;
	 	 final JButton buttonPrev = new JButton( "<<" );
	 	 f1.add( buttonPrev );
	 	 ActionListener al = new ActionListener()
	 	 {
	 		 @Override public void actionPerformed( ActionEvent e){
	 			if(current == 0){
	                current = iconarray.length - 1;
	            }else{
	                current--;
	            }
	            l.setIcon(iconarray[current]);
	 			zwei.setIcon( iconarray[current] );
	 			// Hier versuche ich- ebenso wie im iconarray - das vorangegangene element im hinweisarray anzusprechen
	 			if(current == 0){
	                current = hinweisarray.length - 1;
	            }else{
	                current--;
	            }
	 			hinweislabel.setText(hinweisarray[current]);
	 		}
	 		 
	 	 };
	 	 buttonPrev.addActionListener( al );
	 	f1.add( drei );
 
current gilt doch für Text und Bild in Deiner Action Methode überprüfst und reduzierst Du zwei mal diese Variable. Das zweite mal ist überflüssig - nein, sogar falsch.
 
was passiert denn ganz konkret in einem Durchlauf, der etwa mit current 0 beginnt?
das erste if-else setzt current auf den letzten Index, z.B. 70, und holt das zugehörige Icon,

danach wird current auf 69 verringert, und das falsche Label geholt,
current ist doch schon fertig berechnet, wieso machst du dazu noch irgendwas?
 
Ich möchte nicht nur die durch current berechnete Position des icon-arrays darstellen, sondern auch die current Position des hinweisarrays.
 
wenn beide Arrays gleich lang sind und alle Indexe zusammengehören, dann reicht eine current-Variable,
die du eben nur einmal verringern musst und fertig, der richtige Index für beide Arrays,
nicht zweimal verringern,

ansonsten kannst du zwei Indexe verwenden, aber immer noch nicht ein und dasselbe current zweimal verringern,
aber das wird sicher nicht der Fall sein

falls alles nicht stimmt, obwohl es schon vor einer Woche sonnenklar aussah,
musst du mal in mehr als einem Satz beschreiben, was 'current Position des hinweisarrays' usw. ist,
Beispiele helfen immer, ich habe eins gegeben mit 70, 69 usw., welches genau das Problem aufzeigt wie ich es verstehe,

wenn du das nachvollzogen hast, es dir aber um etwas anderes geht, dann versuche das zu kommunizieren..
 
Zuletzt bearbeitet von einem Moderator:
Genau, Du hast das richtig verstanden. Ich möchte den gleichen Index von zwei unterschiedlich langen Arrays abrufen. Dabei wird wie Du beschrieben hast die current-Varibale runtergezählt und der Index mit ihrem Wert aufgerufen. Das funktioniert jedoch nicht beim String-Array (hinweisarray).

Ich habe mal testweise das iconarray gegen das hinweisarray (String-Array) ausgetauscht:

Java:
 final JTextArea drei  = new JTextArea(hinweisarray[current]);
	 	 f1.add( drei );
	 	 
	 	 ActionListener al = new ActionListener()
	 	 {
	 		 @Override public void actionPerformed( ActionEvent e){
	 		
	 			if(current == 0){
	                current = hinweisarray.length - 1;
	            }else{
	                current--;
	            }
	            drei.setText(hinweisarray[current]);
	 	
	 		 }

Zurückgegeben wird dann das erste Element (Hinweis1), der nächste ActionEvent liefert dann ein leeres Textfeld. Das Problem ist, dass hinweisarray[current] nicht das nächste heruntergezählte Element des Arrays liefert. Woran liegt das? Statt dem label habe ich jetzt TextArea verwendet
 
bisher hattest du beide Arrays in einem Listener,
nun zeigst du nur noch eine Hälfe, gibt es für die andere auch einen Listener mit derselben current-Variable?,
wird dort current verringert, wann wird dieser Button geklickt?,
muss nicht, wie es vorher verständlich war, gleichzeitig das Icon und der Text aktualisiert werden?

für mich ist nun mit einem Schlag alles unklar, was im Programm passieren soll, wie du es umgesetzt hast, was current alles macht usw.

als Tipp habe ich dann nur noch den in Hut, den ich eigentlich auch sowieso überall schreibe 😉 :
loggen loggen loggen,
gib in jedem Listener mit System.out.println() aus, welcher Button gerade geklickt wurde, welchen Wert current vorher hatte,
auf was current evtl. geändert wird, was du aus welchem Array als Wert herausholst und wohin schreibst und was sonst noch spannend ist,
dazu musst du natürlich wissen, was du parallel in der GUI klickst und was passieren soll

vergleiche also den Wunsch "ich klicke jetzt next-Button und will dass statt Hinweis 45 'Vorsicht Glas' Hinweis 46 'Vorsicht Stein' angezeigt wird"
mit Programmlog
- Listener zu Button next wird aktiv
- alter current war: 45
- ändere current auf: 46
usw.

wenn irgendwas faul läuft, ist das im Log hoffentlich zu erkennen,
z.B. dass current schon vor/ zu Beginn des Buttonklicks falsch war,
etwa weil ein anderer Button auch mit current arbeitet usw.
 
Zuletzt bearbeitet von einem Moderator:
Entschuldigt bitte die Verwirrung, der letzte Post enthielt Test Code um zu überprüfen ob das Durchklicken nur durch die Texte möglich ist (später habe ich dann die Bilder hinzugenommen).

Da die arrays unterschiedlich lang sind habe ich eine zweite Variable current angelegt. Jetzt funktioniert es:

Java:
 ActionListener al = new ActionListener()
	 	 {
	 		 @Override public void actionPerformed( ActionEvent e){
	 			if(current == 0){
	                current = iconarray.length - 1;
	            }else{
	                current--;
	            }
	            l.setIcon(iconarray[current]);
	 			zwei.setIcon( iconarray[current] );
	 			
	 			if(current2 == 0){
	                current2 = hinweisarray.length - 1;
	            }else{
	                current2--;
	            }
	 			//System.out.print(hinweisarray.length);
	 			//System.out.println( "text: " + hinweisarray[current2] + " index: " + current2);
	 			drei.setText(hinweisarray[current2] +" test");
	 			
	 		 } 
	 		 
	 		 
	 	 };

Habt vielen Dank für eure Geduld und Hilfe 🙂
 
Zuletzt bearbeitet:

Zurück
Oben