Images verschwinden?

Razielim

Neues Mitglied
Hallo allerseits.

Ich bin gerade dabei einen Programmierbeleg zu erstellen. Dabei handelt es sich um ein Schieberätsel.
Das Rätsel funktioniert auch, doch habe ich nun noch einige kleine Probleme. Das wichtigste zuerst:

Ich habe eine Bildergalerie, die die Bilder im Ordner Images anzeigt.
Wenn ich die Klasse direkt aufrufe mit ihrer eigenen mainMethode, dann werden mir die Bilder auch angezeigt. Wenn ich aber die Klasse über meine Hauptklasse aufrufe, werden die Bilder nur kurz gezeichnet und dann verschwinden sie oder werden überzeichnet. Aber die Labels unter den Bildern bleiben erhalten.
Ich habe die Vermutung das es etwas mit Repaint zu tun hat.

Die Galerie wird durch den Button Ok im Abfragefenster aufgerufen. Befindet sich in "EingabeStr".

Java:
class Galerie extends Frame{
	
	public static void main(String args[]){
		
		try {
			new Galerie();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	
}
	
	public Galerie(){
		
		try{
		
		setSize(300, 300);
	    setLocation(200, 200);
	    setResizable(false);
	    setLayout(new BorderLayout());
	    setBackground(Color.WHITE);
	    setTitle("Bild aus Galerie wählen:");
	    
	    //fügt ein Panel am unteren Rand ein
	    Panel knopfPanel = new Panel();
	    add(knopfPanel, "South");
	    knopfPanel.setBackground(Color.LIGHT_GRAY);
	   
	    //fügt ein Label am unteren Rand auf dem Panel ein
	    Label frage2 = new Label("oder Bild hochladen:");
	    knopfPanel.add(frage2);
	    //Fügt einen Button auf das Panel
	    Button ladeButton = new Button("      Bild laden      ");
	    knopfPanel.add(ladeButton);
	    ladeButton.addActionListener(new ladenStrg(this));
	    
	   
	     
	    addWindowListener(new FensterSchliesser(this));
	    setVisible(true);}catch(Exception e){System.out.println("Es ist ein Fehler im Fenster aufgetreten");}
		
	    
		ordnerLesen();
		
		
	
}
	void fensterSchliesser(){
		 dispose();
       System.exit(0);
	}
	
	class FensterSchliesser extends WindowAdapter{

	    private Galerie frame;
	   

	    public FensterSchliesser(Galerie f) {
	        frame = f;
	        
	    }

	    public void windowClosing(WindowEvent e) {
	       frame.fensterSchliesser(); //methode zum schlie�en
	       
	        
	    }
	}
	
	//Beobachter-Klasse für "ladeBild" Schaltfläche
		class ladenStrg implements ActionListener {

		    private Galerie frame;

		    public ladenStrg(Galerie f){
		        frame = f;
		    }

		    public void actionPerformed(ActionEvent e) {
		       try {
		    	   
		    new Puzzle.OeffnenDialog();
		    //String path = Puzzle.OeffnenDialog.inputVerzStr;
		    //new Puzzle.PuzzleFenster(path);
		    
				
		    	
			
			} catch(Exception e1) {
				System.out.println("Es ist ein Fehler in ladenStrg aufgetreten");
			}
		    }

	}
	

	
	public void ordnerLesen(){
	
		try{
	
		File[] filenames = new File[10];
		File file = new File(".\\Images"); //liest Ordner Images ein
		filenames = file.listFiles(); //speichert die dateien in einem array
		 int x=10;
         int y=10;
			for (int i = 0; i < filenames.length; ++i) {
	            File f = new File(filenames[i].toString()); //erstellt für jede Datei eine File
	        	
	            BufferedImage[] im= new BufferedImage[10];
	          
	            try {
	            	
					im[i] = ImageIO.read(f); //liest Bilder
					
					
					paint(im[i],x,y,f);	//zeichnet Bilder
					
					x= x+90;
					if(x>=270){
						y=y+80;
						x=10;
					}
					
					}catch(IOException e1){System.out.println("Es ist ein Fehler beim lesen der Bilder aufgetreten");}
			
			}
		}catch(Exception e){System.out.println("Es ist ein Fehler in ordnerLesen aufgetreten");}
        
	}


	
	
	public String paint(BufferedImage b, int x, int y, File f){
		
		int width = 80;
		int height = 60;
	Image im = b;
	Graphics g= this.getGraphics();
	Label[] lab = new Label[100];
	int i = 0;
	String path = f.toString();
	int startName = path.lastIndexOf("\\");
	int endName = path.lastIndexOf(".");
	String name = path.substring(startName, endName);

	

		try{
			
		
		lab[i] = new Label(path);
		lab[i].setText(name);
		lab[i].setLocation(x,y+60);
		lab[i].setSize(80,10);
		lab[i].setVisible(true);
		lab[i].addMouseListener(new BildStrg(path));
		add(lab[i]);
		System.out.println(lab[i]);
		 

		 g.drawImage(im, x, y, width, height, this);
		 
		 i++;
		 
		 
		
		}catch(Exception e){System.out.println("Fehler");}
		return path;
		
		
		
	}
	

	
	class BildStrg implements MouseListener{
		
	String path;
	
		
		public BildStrg(String s){
			
					path = s;
				
			}
		
		public void mouseClicked(MouseEvent e){
		
		int ClickedCount = e.getClickCount();
        if(ClickedCount > 0){
        	
       
			System.out.println(path);
        	try {
        		//this.puzzle.zeichneBild(path);
				//new Puzzle.PuzzleFenster(path);
        		new paintTest(path);
				setVisible(false);
				
			} catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
        }}


Java:
//Hauptklasse
public class Puzzle extends Frame{
	
	
	static int n =0;			//Anzahl der Spielfelder
	
	 

	public static void main(String[] args){
		try{
	
		AbfrageFenster puz = new AbfrageFenster();
		
		}catch(Exception e3){System.out.println("Es ist ein Fehler in der mainMethode");}
		
		}
	

	
	
	//Methode zur ermittlung des Wertes für die Anzahl der Spielfelder
		 public static int wert(){
			  String s = AbfrageFenster.eingabe.getText(); //liest text aus dem abfragefeld
			  n = Integer.parseInt(s); //wandelt von String zu int
			  System.out.println(n);
			  return n;
			
		 }
		 
		 
	

//Abfragefenster bei Wahl eines neuen Spiels.
static class AbfrageFenster extends Frame{
	
	
	static TextField eingabe;
	Label frage;
	
	Button ok;

	
	  public AbfrageFenster() throws Exception{
		  
		
		try{
		
		
			//Bauen des Fensters
			setSize(100, 100);
			setLocation(600, 600);
  
			setResizable(false);
			setLayout(new BorderLayout());
			setBackground(Color.WHITE);
  
			//Label und textfeld Größenfeststellung
			frage = new Label("Anzahl Spielsteine (x/x):");
			add(frage, BorderLayout.NORTH);
			eingabe = new TextField();
			eingabe.setEditable(true);
			add(eingabe, BorderLayout.CENTER);
  
 
  
			// Knopf zum Bestätigen und schließen des fensters
			ok = new Button("     OK    ");
			add(ok, BorderLayout.SOUTH);
			ok.addActionListener(new EingabeStrg(this));
  
			
			addWindowListener(new FensterSchliesserAbfrage(this)); //Zum schlie�en des Fensters �ber das X
			setVisible(true); //sichtbar machen
		
		}catch (Exception e){System.out.println("Es ist ein Fehler im Abfragefenster aufgetreten)");}
		
	}
	  
	void fensterSchliesser(){
		 dispose();
   System.exit(0);
	}
	
	class FensterSchliesserAbfrage extends WindowAdapter{

	       
	       private AbfrageFenster abfrage;

	       public FensterSchliesserAbfrage(AbfrageFenster ab) {
	           
	           abfrage = ab;
	       }

	       public void windowClosing(WindowEvent e) {
	         
	          abfrage.fensterSchliesser();
	           
	       }
	   }
	
	

	//Klasse zur Steuerung des OK-Buttons
	 class EingabeStrg implements ActionListener {

	
		 private AbfrageFenster frame;
		 
		 
    	public EingabeStrg(AbfrageFenster ab) {
        
    		frame = ab;
        
    	}

    		public void actionPerformed(ActionEvent e) {
    			try{
    				
    				if((wert()>10)||(wert()<3)){
    					 AbfrageFenster.eingabe.setText("Bitte Zahl zwischen 3 und 10 eingeben");
    				}
    					
    				n= wert(); //liest wert aus 
    				new Galerie(); //öffnet die Bildergalerie
    				frame.setVisible(false);	//wird unsichtbar da schließen sonst alles schließt
    				
    				

    			}catch(Exception e2){System.out.println("Es ist ein Fehler in EingabeStrg aufgetreten");}
    		}

	 }


 }
	
	
 

	   
	 
	
	//Klasse zum öffnen eines Dateiauswahl-Fensters.
	    public static class OeffnenDialog { 
	    	
	   String inputVerzStr;
	    	
	    	public OeffnenDialog(){
	    		
	    		 
	  	            final JFileChooser chooser = new JFileChooser("Verzeichnis wählen"); 
	  	            chooser.setDialogType(JFileChooser.OPEN_DIALOG); 
	  	            chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); //nimmt einen int-Wert in Form des Feldes FILES_AND_DIRECTORIES entgegen, der bestimmt, dass der Dialog sowohl Verzeichnisse als auch Dateien zeigt.
	  	            final File file = new File("/home"); 

	  	            chooser.setCurrentDirectory(file); //legt Ausgangsverzeichnis fest

	  	            chooser.addPropertyChangeListener(new PropertyChangeListener() { 
	  	                public void propertyChange(PropertyChangeEvent e) { 
	  	                    if (e.getPropertyName().equals(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY) 
	  	                            || e.getPropertyName().equals(JFileChooser.DIRECTORY_CHANGED_PROPERTY)) { 
	  	                        final File f = (File) e.getNewValue(); 
	  	                    } 
	  	                } 
	  	            }); 

	  	            chooser.setVisible(true); 
	  	            final int result = chooser.showOpenDialog(null); 

	  	            if (result == JFileChooser.APPROVE_OPTION) { 
	  	                File inputVerzFile = chooser.getSelectedFile(); 
	  	                
	  	                inputVerzStr = inputVerzFile.getPath(); 
	  	                
	  	                 
	  	            }else {inputVerzStr=null;
	  	            		chooser.cancelSelection();}
	  	            
					try {
						new paintTest(inputVerzStr);
					} catch (Exception e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
	  			
	  			
	  	          
	  	       
	  	    	
	    	}
	    	
}
}

Die Hauptklasse ist noch etwas durcheinander, da sie eigentlich mal größer war, und ich einige Teile ausgelagert habe.
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
du darst nie getGraphics() der GUI-Komponenten aufrufen,
beim nächsten normalen repaint() sind diese Sonder-Mal-Anzeigen weg, wie du selbst schon erkennst

a)
speichere die Bilder in Instanzvariablen, überschreibe paintComponent usw. nach Lehrbuch,
zeichne also bei jedem repaint die Bilder neu

b)
male die Bilder direkt, aber nicht auf die Komponente sondern ein Image-Objekt, von welchem du dann durchaus getGraphics() aufrufen kannst und musst,
das Image mit allen Bildern dann wiederum in paintComponent ständig malen, erspart die Verwaltung aller Bilder

c)
alle Bilder in JLabel als Icon setzen, diese JLabel einfügen,
vielleicht sogar deine vorhandenen Label, den Text passend dazu anordnen,
also in jedem Label Bild + Text zusammen, dann auch keine Mühe mit gleicher Positionsberechnung


alle Varianten kann man im Detail sicher ausführlicher besprechen,
ich belasse es erstmal dabei und erhoffe von deiner Seite etwas Eigenbeschäftigung,
z.B. Nachschlagen im Internet zu den Stichwörtern
 

Razielim

Neues Mitglied
Hallo Slater,

danke für deine Tips. Das JLabel funktioniert besser als ich gedacht habe. Nach langem hin und her habe ich nun herausgefunden was dafür alles benötigt wird und konnte so einiges rauswerfen.

Meine paint Methode sieht jetzt so aus und funktioniert wunderbar:

Java:
public void paintComponent(BufferedImage b, int x, int y, File f){
		
		int width = 80;
		int height = 60;
		

	String path = f.toString();
	JLabel lab = new JLabel();
	Image im = b.getScaledInstance(width, height, Image.SCALE_SMOOTH);
	ImageIcon icon = new ImageIcon(im);

	
	
	try{
	lab = new JLabel(icon,JLabel.CENTER);
	lab.setBounds(x, y, width, height);
	lab.addMouseListener(new BildStrg(path));
	getContentPane().add(lab);
	
	}catch(Exception e){}

	
	}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Images aus einem Array ausgeben Java Basics - Anfänger-Themen 3
DaCrazyJavaExpert Erste Schritte Images bei JAR mitexportieren Java Basics - Anfänger-Themen 58
J Wie kann ich Images per Tastendruck anzeigen/einfügen? Java Basics - Anfänger-Themen 3
Y resize von images Java Basics - Anfänger-Themen 1
Z Zwei Images auf einem JFrame - Aber nur eins wird angezeigt! Java Basics - Anfänger-Themen 5
J Hoher Speicherverbrauch beim Zeichnen von Images aus einer ArrayList Java Basics - Anfänger-Themen 10
T Erste Schritte Speicher läuft voll, Diashow, Images Java Basics - Anfänger-Themen 7
Luk10 Images und Koordinaten Java Basics - Anfänger-Themen 4
E Probleme mit Images verschieben Java Basics - Anfänger-Themen 4
E java.lang.OutOfMemoryError beim Rotieren eines Images Java Basics - Anfänger-Themen 14
R Problem beim Laden eines Images Java Basics - Anfänger-Themen 7
O Images erstellen Java Basics - Anfänger-Themen 3
P Images auf JPANEL? Java Basics - Anfänger-Themen 21
B Durchsichtige Images werden beim kopieren schwarz Java Basics - Anfänger-Themen 21
M images löschen mit *.jpg ? Java Basics - Anfänger-Themen 4
I Buffered Images vergleichen Java Basics - Anfänger-Themen 3
P Images im Archiv .jar Java Basics - Anfänger-Themen 9
E Images bzw jpegs speichern Java Basics - Anfänger-Themen 5
P Transparente Images Java Basics - Anfänger-Themen 5
H Images in jar Java Basics - Anfänger-Themen 6
S ordnerinhalt lesen , images als "greifbare" elemen Java Basics - Anfänger-Themen 3
megachucky wo gibts icons, images und sound dateien zum download? Java Basics - Anfänger-Themen 2
M Bildgröße (in Byte) eines Images ermitteln Java Basics - Anfänger-Themen 2
H Hotspots in Images Java Basics - Anfänger-Themen 2
B Objekte verschwinden beim Übersetzen Java Basics - Anfänger-Themen 5
00111010101 Objektorientiertes Programmieren mit Vererbung (Zahlen in Array verschwinden) Java Basics - Anfänger-Themen 3
W Wie lasse ich meine Ausgabe nach dem Lesen verschwinden ? Java Basics - Anfänger-Themen 1
S JButton soll für bestimmte Zeit verschwinden Java Basics - Anfänger-Themen 5
F Java BlueJ Dinge verschwinden lassen Java Basics - Anfänger-Themen 2
D Erste Schritte Canvas verschwinden nicht mehr Java Basics - Anfänger-Themen 2
C Bild verschwinden lassen Java Basics - Anfänger-Themen 7
M MergeSort - Zahlen verschwinden Java Basics - Anfänger-Themen 2
R ArrayList Objekte verschwinden Java Basics - Anfänger-Themen 8
B Mauszeiger verschwinden lassen Java Basics - Anfänger-Themen 10
J punkte verschwinden beim neuzeichnen neuer punkte Java Basics - Anfänger-Themen 11
U X-Button verschwinden lassen Java Basics - Anfänger-Themen 6
G Anwendung aus der Fensterleiste verschwinden lassen Java Basics - Anfänger-Themen 4
G mit Graphics erzeugte Strings verschwinden sofort wieder Java Basics - Anfänger-Themen 7
J Form2 anzeigen und verschwinden lassen? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben