Swing Bei repaint() tut sich nichts

  • Themenstarter Themenstarter v1cious
  • Beginndatum Beginndatum
V

v1cious

Gast
Hi,
ich fange grade erst wirklich an mit swing zu programmieren und bin am verzweifeln..
Mein Programm soll Bilder aus einem Ordner herauslesen und (vorerst) nur das erste anzeigen.

Ich mache das mit einem Filechooser, der nur Ordner darstellt. In dessen ActionListener werden die Dateinamen aus dem ausgewählten Ordner ausgelesen und zu einer ArrayList names Images hinzugefügt. Klappt auch alles wunderbar.
Jetzt habe ich "JComponent orgImg", welches einmal ein JLabel sein soll ("Kein Bild vorhanden, blabla"), und sobald dann was in meinem Images-Array drinsteht ein ImageViewer werden soll. Dieser sieht folgendermaßen aus:

Java:
package dialog;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

import javax.swing.JComponent;

@SuppressWarnings("serial")
public class ImageViewer extends JComponent {
    public BufferedImage img;
    int size = DialogUtil.RESIZE;

    public ImageViewer(BufferedImage image) {
        this.img = image;
    }

    public void paintComponent(Graphics g) {
        g.drawImage(img.getScaledInstance(size, size, BufferedImage.SCALE_DEFAULT), 0, 0, null);
    }
    
    public Dimension getPreferredSize() {
        return new Dimension(size, size);
    }

}

Die Zuweisung nehme ich folgendermaßen vor:

Java:
private void viewImage(int idx) {
	BufferedImage image;
        if (Images != null) {
        	Path path = Images.get(idx);
        	try {
    			image = ImageIO.read(new File(path.toString()));
    			orgImg = new ImageViewer(image);
    		} catch (IOException e) {
    		}
        } else {
        	orgImg = new JLabel("No Image input folder selected");
        }
	}

Nachdem dieses viewImage in meinem filechooser-Actionlistener durchgelaufen ist, ist orgImg ein ImageViewer (oder?). Dann rufe ich orgImg.repaint() auf und nichts passiert..? Ich weiß ehrlich nicht was ich falsch mache, vielleicht könnt ihr mir helfen...

Mfg v1c

ps: hier noch der code vom Actionlistener des filechoosers:

Java:
// Input FC Button
		JButton inputSelectBtn = new JButton(DialogUtil.SELECT);
		inputSelectBtn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				int returnVal = inputFC.showOpenDialog(FilterPanel.this);
				if (returnVal == JFileChooser.APPROVE_OPTION) {
					inputVwr.setText(inputFC.getSelectedFile().toString());
					
					Path dir = inputFC.getSelectedFile().toPath();
					DirectoryStream<Path> stream = null;
					try {
					    stream = dir.newDirectoryStream("*.bmp");
					    Images = new ArrayList<Path>();
					    for (Path file : stream) {
					    	Images.add(file);
					    }
					    viewImage(0);
		    			orgImg.repaint();
					} catch (IOException x) {
					    System.err.println(x);
					} finally {...}

				}
			}
		});
 
hmm ok, die komponente entfernen funktioniert, aber wenn ich danach was neues adde (selbst nen einfaches Label oder sowas) passiert nichts:

Also wenn ich im ActionListener das hier hab:

Java:
FilterPanel.this.remove(orgImg);
					    viewImage(0);
					    
					    c.gridx = 1;
						c.gridy = 2;
						c.fill = GridBagConstraints.NONE;
						c.weightx = 0;
						c.gridwidth = 2;
						FilterPanel.this.add(new JLabel("test"), c);
						FilterPanel.this.repaint();
 
Got it, the last bit of FilterPanel.this.repaint(); wasn't needed, i had to use FilterPanel.this.validate(); instead.

Thx for help tho 🙂
 

Zurück
Oben