Zufallsbilder laden

I.E.

Mitglied
Moin Leute,

ich habe hier ein kleines Programm mit einem Panel für Bilder, und einem Button unten, der beim raufdrücken eins von drei Bildern auf das Panel laden soll. Er soll, tut er aber nicht.

Wenn ich direkt im GUI-Code eins der Bilder an das Bilder-Panel anknüpfe, wird es mir auch angezeigt. Wenn ich auch den Zufallsgenerator in der GUI habe, wird mir bei jedem neuen Aufmachen des Programms die App mit einem zufälligen Bild angezeigt.

Wenn ich den Zufallsgenerator in den Action-Listener-Code reinstecke (so wie im Code unten), kommt da gar nichts. Wo ist der Fehler? Ich glaube, hier liegt kein Logikfehler vor (mit anderen Objekten funktioniert dieser Code prima), sondern um einen in diesem Fall falschen Code zum Herausholen von externen Bildern. Wie mache ich das richtig?

Java:
import javax.swing.*; 
import java.util.*;
import java.awt.*;
import java.awt.event.*;
public class randomimage {


public static void main(String[] args) {
	randomimage ri = new randomimage(); 
	ri.gui(); 					
	}//main()

JFrame Rahmen; 
JPanel imageP; 
JButton button;
ArrayList<JLabel> picList; 

void gui(){
Rahmen = new JFrame(" random image app");	 	
 	
imageP = new JPanel(); 
imageP.setBackground(Color.red); 	
button = new JButton("get a new random image!"); 	
button.setPreferredSize(new Dimension(100,100)); 
button.addActionListener(new buttonListener()); 

picList = new ArrayList<JLabel>();
JLabel pic0 = new JLabel(new ImageIcon("C:\\cl0.png"));
picList.add(pic0); 
JLabel pic1 = new JLabel(new ImageIcon("C:\\cl1.png")); 
picList.add(pic1); 
JLabel pic2 = new JLabel(new ImageIcon("C:\\cl2.png"));
picList.add(pic2); 

Rahmen.getContentPane().add(BorderLayout.CENTER, imageP); 
Rahmen.getContentPane().add(BorderLayout.SOUTH, button); 

Rahmen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
Rahmen.setSize(300,450); 
Rahmen.setVisible(true);
}//gui()


public class buttonListener implements ActionListener{
	public void actionPerformed(ActionEvent e){
	
	int rand = (int)(Math.random()*picList.size()); 
	JLabel randPic = picList.get(rand);  

	imageP.add(randPic); 
	Rahmen.repaint(); 
	
}}//buttonListener






}//class randomimage
 

Foxei

Bekanntes Mitglied
Hi I.E,
Vorneweg muss ich dir sagen das du einige Programmier Standards ignorierst.
Erstens Initialisiert man nur die Objekte als Atribute die man auch später nochmal aufrufen möchte. (Bei dir nur das Array und das Panel) Und diese sollten auch bitte mit Private, Public, Static etc... bezeichnet werden das Dient erstens der Übersicht und zweitens kann das später zu Problemen führen das nicht zu tun..
Und zweitens sollte man Objekte zu ende erzeugen bevor man ein neues erzeugt. Du hast eine Frame erzeugt und dann alles andere bevor du die Größe etc der Frame gesetzt hast, dies hat zwar keine Auswirkungen auf das Programm aber wenn du später eine mal große Programme schreibst könnte das sehr unübersichtlich werden.

So nun zu deinem Problem ich habe dazu einen etwas anderen Lösungsansatz gewählt: Warum denn die JLabel speichern wenn man auch einfach die 3 Bilderspeichern kann und diese dann abwechselnd auf ein JLabel bringt. Bedeutet dein Array Speichert jetzt ImageIcons und dein Panel wird ein Label.

Nun zu deiner Random Funktion: Hier muss jetzt nur basierend auf deiner Nummer das bild aus dem Array gelesen werden und als Icon auf das Label gesetzt werden. Ergenzent habe ich die Funktion noch ergänzt das nach jedem Bild auf wirklich ein anderes kommt und nicht 10 mal Bild 1 :D
Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UIManager;

public class RandomImage {

	public static void main(String[] args) {
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
			RandomImage ri = new RandomImage();
			ri.gui();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private JLabel panelImage;
	private ArrayList<ImageIcon> picList;
	private int lastRandom=-1;
	void gui() {
		picList = new ArrayList<ImageIcon>();
		picList.add(new ImageIcon(getClass().getResource("./images/file_odt.png")));
		picList.add(new ImageIcon(getClass().getResource("./images/file_word.png")));
		picList.add(new ImageIcon(getClass().getResource("./images/file_pdf.png")));

		JFrame frame = new JFrame(" random image app");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(300, 400);
		frame.setLocationRelativeTo(null);
		
		panelImage = new JLabel(){ //paintComponent überschrieben um dafür zu sogern das das Bild auf dem ganzen JLabel erscheint nicht nur in der größe der Bilddatei
			@Override
			protected void paintComponent(Graphics g) {
				if(getIcon()!=null){
					Graphics2D g2d=(Graphics2D) g;
					g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
					g2d.drawImage(((ImageIcon)getIcon()).getImage(), 0, 0, getWidth(),getHeight(),this);
				}
				
			}
		};
		
		JButton btnRandom = new JButton("get a new random image!");
		btnRandom.addActionListener(new buttonListener());
		btnRandom.doClick();
		
		frame.add(BorderLayout.CENTER, panelImage);
		frame.add(BorderLayout.SOUTH, btnRandom);
		frame.setVisible(true);
	}

	public class buttonListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {		
			int rand;
			do{ //Schleife verhindert das ein Bilder mehrmals angezeigt werden so wird nach jedem klick ein neues angezeigt
				rand = (int) (Math.random() * picList.size());
			}while(rand==lastRandom);
			lastRandom=rand;			
			panelImage.setIcon(picList.get(rand));
		}
	}
}
 

I.E.

Mitglied
Danke!

Erstens - den ganzen private/public/static-Müll habe ich bislang erfolgreich ignoriert.

Das mit dem Frame habe ich mir irgendwie so angewöhnt. Ich glaube, in dem Buch "Java von Kopf bis Fuß" machen die das auch so. Oder auch nicht.

Jetzt habe ich die "setIcon"-Methode verwendet, und habe auch deinen Vorschlag beherzigt, nur einen Label, und dafür 3 Icons zu verwenden.

Das Programm funktioniert jetzt! Danke dir vielmals!

Allerdings passiert es in meinem Code, dass der Zufallsgenerator mehrmals hintereinander dasselbe Bild ausspuckt (eben das, wovor du eindringlich gewarnt hast). Ich habe schon mal in einem ähnlichen Programm selbst einen Code geschrieben, um solche Wiederholungen zu vermeiden, allerdings ohne die while-Schleife. Die habe ich bislang ebenfalls mit Erfolg ignoriert, kann sein, dass ich sie neulich verwendet habe, und dann aber auf if/for umgestiegen bin. Wird nun langsam Zeit, ihre Vorzüge in Angriff zu nehmen.

Hier ist mein neuer Code:

Java:
import javax.imageio.ImageIO;
import javax.swing.*; 
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class randomimage {


public static void main(String[] args) {
	randomimage ri = new randomimage(); 
	ri.gui(); 					
	}//main()

JFrame Rahmen; 
JPanel imageP; 
JButton button;
JLabel label; 
Icon cl0, cl1, cl2; 
ArrayList<Icon> picList; 

void gui(){
Rahmen = new JFrame(" random image app");	 	
picList = new ArrayList<Icon>(); 
 	
imageP = new JPanel(); 
imageP.setBackground(Color.red); 	
button = new JButton("get a new random image!"); 	
button.setPreferredSize(new Dimension(100,100)); 
button.addActionListener(new buttonListener()); 

label = new JLabel(); imageP.add(label); 

cl0 = new ImageIcon("cl0.png"); 	
picList.add(cl0); 
cl1 = new ImageIcon("cl1.png"); 	
picList.add(cl1); 
cl2 = new ImageIcon("cl2.png"); 	
picList.add(cl2); 


Rahmen.getContentPane().add(BorderLayout.CENTER, imageP); 
Rahmen.getContentPane().add(BorderLayout.SOUTH, button); 

Rahmen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
Rahmen.setSize(300,450); 
Rahmen.setVisible(true);
}//gui()


public class buttonListener implements ActionListener{
	public void actionPerformed(ActionEvent e){
	
		int rand = (int)(Math.random()*picList.size()); 
		Icon randIcon = picList.get(rand); 
		label.setIcon(randIcon); 
			
}}//buttonListener






}//class randomimage

Jetzt fehlt nur noch meine while-Feuertaufe a la foxei, und dann ist der upgrade im Kasten!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Swing Zufallsbilder auf Frame ausgeben AWT, Swing, JavaFX & SWT 1
thor_norsk Icons laden nicht in GUI AWT, Swing, JavaFX & SWT 15
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
G JavaFX Wert aus DB lesen, wenn erfolgreich automatisch eine fxml laden, möglich? AWT, Swing, JavaFX & SWT 2
K JavaFX Bildergalerie aus Image Ordner laden AWT, Swing, JavaFX & SWT 3
L JavaFX .fxml laden klappt nicht AWT, Swing, JavaFX & SWT 16
DeBoiJoshua 2D-Grafik Gif Animation will nicht laden AWT, Swing, JavaFX & SWT 1
R Grafik per JButton laden und austauschen lassen AWT, Swing, JavaFX & SWT 14
H Images laden nicht AWT, Swing, JavaFX & SWT 14
B Swing Sudoku: Laden / Speichern von Zahlen aus/in mehrere JTextFields aus/in eine(r) Textdatei AWT, Swing, JavaFX & SWT 9
A Swing Datei lässt sich zwar speichern, aber nicht laden (Inhalt im JTextField anzeigen) AWT, Swing, JavaFX & SWT 18
C Swing F5 Taste neu laden auf ganzen Frame AWT, Swing, JavaFX & SWT 9
N Swing Image aus Web laden und in Icon umwandeln AWT, Swing, JavaFX & SWT 4
J Bild von anderer Klasse will nicht laden AWT, Swing, JavaFX & SWT 1
F JavaFX PNG aus einem resource Ordner laden AWT, Swing, JavaFX & SWT 8
L JavaFX LoadException beim Laden von JavaFX Anwendung AWT, Swing, JavaFX & SWT 6
F JButtons neu laden AWT, Swing, JavaFX & SWT 4
M AWT Laden von Sprites AWT, Swing, JavaFX & SWT 3
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
@SupressWarnings() JavaFX Bilder in executable jar laden AWT, Swing, JavaFX & SWT 5
S JavaFX Laden des Inhalts AWT, Swing, JavaFX & SWT 1
L JavaFX Verzögerung beim Laden von Daten AWT, Swing, JavaFX & SWT 6
I Scene Builder kann .fxml nicht mehr laden AWT, Swing, JavaFX & SWT 3
S NullPointer Exception beim Laden von Bildern AWT, Swing, JavaFX & SWT 11
X Java Fxml laden AWT, Swing, JavaFX & SWT 4
G Properties automatisch laden AWT, Swing, JavaFX & SWT 10
D JavaFX Gesetzte Variable in einem Controller im Controller laden AWT, Swing, JavaFX & SWT 1
L Graphik nach 100 ms neu laden AWT, Swing, JavaFX & SWT 1
Z JAVAFX Stage über Controller weitergeben um css-file zu laden AWT, Swing, JavaFX & SWT 4
S JavaFX Fenstergrösse automatisch Speichern und Laden AWT, Swing, JavaFX & SWT 4
M Datenbanksätze in ToolTip laden AWT, Swing, JavaFX & SWT 4
A JPanel Bild laden (Porblem mit Dateipfad) AWT, Swing, JavaFX & SWT 2
D Swing Bei Button Click neues Panel laden AWT, Swing, JavaFX & SWT 3
C Image laden und Speichern - Image wird auf JPanel nicht angezeigt AWT, Swing, JavaFX & SWT 4
X JFrame erst nach dem Laden sichtbar stellen AWT, Swing, JavaFX & SWT 8
N FXML Dokument laden AWT, Swing, JavaFX & SWT 1
J Bilder auf JPanel (im JScrollPane) nacheinander laden AWT, Swing, JavaFX & SWT 0
B Ressourcen laden beim Ausführen der .jar nicht schnell genug AWT, Swing, JavaFX & SWT 2
V JavaFX - fxml-Datei laden (neben CSS) AWT, Swing, JavaFX & SWT 2
T AWT Bild laden und transparent zeichnen AWT, Swing, JavaFX & SWT 2
J Swing Bild laden, Kreise drin malen, Schreiben AWT, Swing, JavaFX & SWT 2
M Swing Elemente im Dialog neu "laden". AWT, Swing, JavaFX & SWT 6
K JLabel nachträglich laden AWT, Swing, JavaFX & SWT 6
T Modell als XML Speichern / Laden AWT, Swing, JavaFX & SWT 9
B Hintergrund laden AWT, Swing, JavaFX & SWT 3
V Laden einer Bitmap / Eclipse-Problem? AWT, Swing, JavaFX & SWT 4
S Font laden, Wort zeichnen und animieren..? AWT, Swing, JavaFX & SWT 2
G Objekte in und aus einer JTable laden AWT, Swing, JavaFX & SWT 5
H 2D-Grafik Bilder laden ist nicht zuverlässig AWT, Swing, JavaFX & SWT 3
V Persistentes Objekt laden Progressbar AWT, Swing, JavaFX & SWT 7
Luk10 Fragen zum Laden von Fonts AWT, Swing, JavaFX & SWT 4
B Swing Laden von serialisierten Objekten (invalid type code AC)) AWT, Swing, JavaFX & SWT 3
N Swing BufferedImage neu laden AWT, Swing, JavaFX & SWT 10
C SWT Mehrere Bilder in GUI laden AWT, Swing, JavaFX & SWT 5
T Swing Laden eines Icons auf JButton liefert NullPointerException AWT, Swing, JavaFX & SWT 8
C 2D-Grafik bild aus resource folder laden AWT, Swing, JavaFX & SWT 3
R Image laden sehr langsam AWT, Swing, JavaFX & SWT 7
Luk10 Laden von eingebundenen .png Datein AWT, Swing, JavaFX & SWT 15
S Objekt einmal laden zweimal anzeigen 3d AWT, Swing, JavaFX & SWT 6
C 2D-Grafik BufferedImage laden, Frage zum Code AWT, Swing, JavaFX & SWT 2
P Text-Vorschläge für JTextField aus ner Liste laden AWT, Swing, JavaFX & SWT 8
J Bild aus Datei in BufferedImage laden AWT, Swing, JavaFX & SWT 4
S GUI per XML zur Laufzeit laden AWT, Swing, JavaFX & SWT 5
P 2D-Grafik Fehler beim Laden eines Bildes AWT, Swing, JavaFX & SWT 25
X Bild via FileChooser in paint-Methode laden AWT, Swing, JavaFX & SWT 2
B Problem beim laden von Bild mit getResource() AWT, Swing, JavaFX & SWT 3
L Swing Bilder über andere Bilder laden AWT, Swing, JavaFX & SWT 3
M Bild aus .jar Archiv laden geht nicht AWT, Swing, JavaFX & SWT 6
H Swing HTML in einem JEditorPane zeilenweise hinzufügen ohne Inhalt jedes Mal neu zu laden AWT, Swing, JavaFX & SWT 4
D Swing JTable in Datei speichern und laden AWT, Swing, JavaFX & SWT 3
E Laden von Bilddateien erzeugt OutOfMemory Error AWT, Swing, JavaFX & SWT 6
F Swing Zur Laufzeit Bild laden und auf JPanel anzeigen AWT, Swing, JavaFX & SWT 4
H Applet - Hilfedateien im Browser öffnen / eine Webseite laden AWT, Swing, JavaFX & SWT 6
B ImageIO gif Dateien laden AWT, Swing, JavaFX & SWT 7
S Ordner mit Bildern laden AWT, Swing, JavaFX & SWT 2
E Swing Panel neu laden /neu zeichnen AWT, Swing, JavaFX & SWT 4
S JInternalFrame oder JTextArea neu laden AWT, Swing, JavaFX & SWT 2
O Tabelle laden - Prozessorlast 100% ?? AWT, Swing, JavaFX & SWT 11
N Tablle nach SQL-Update neu Laden AWT, Swing, JavaFX & SWT 4
O Swing JInternalFrame komplett neu laden AWT, Swing, JavaFX & SWT 3
Z JTable neu laden AWT, Swing, JavaFX & SWT 19
R JTable nur sichtbaren Bereich laden AWT, Swing, JavaFX & SWT 12
Dit_ Mit Button "Weiter" neues Panel laden, altes ausblenden... AWT, Swing, JavaFX & SWT 4
SuperSeppel13 Vorschuabilder laden AWT, Swing, JavaFX & SWT 6
H SWT TabItem von Methode "neu laden" AWT, Swing, JavaFX & SWT 3
Developer_X Java BMP-Dateien laden AWT, Swing, JavaFX & SWT 2
C Bild in ein JPanel laden AWT, Swing, JavaFX & SWT 4
W Frame Speichern/laden AWT, Swing, JavaFX & SWT 7
T HTML Seite neu laden mittels Applet AWT, Swing, JavaFX & SWT 2
R Swing JTable, werte speichern und laden AWT, Swing, JavaFX & SWT 25
D Font laden AWT, Swing, JavaFX & SWT 2
C Problem mit Bild neu laden AWT, Swing, JavaFX & SWT 7
S JTappedPane neu laden AWT, Swing, JavaFX & SWT 2
Fadi Images in JAR Datei laden? AWT, Swing, JavaFX & SWT 5
D Event beim Laden eines JPanels? AWT, Swing, JavaFX & SWT 3
S [ANT] jsch jar aus einem anderen Ordner laden AWT, Swing, JavaFX & SWT 7
1 Laden einer Datei zur Echtzeit Darstellen AWT, Swing, JavaFX & SWT 7
A JTable neu laden AWT, Swing, JavaFX & SWT 2
F csv Datein in Tabelle laden AWT, Swing, JavaFX & SWT 2
M html aus einem Stream Laden und Anzeigen AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben