Bild hinzufügen zu GUI - JAVA?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet
  • Du versuchst, das Bild aus der Jar-Datei zu laden, obwohl es sich in deinem Homeverzeichnis befindet. ;)
  • Durch deinen hardgecodeten Linux-Pfad "/home/marc/Bilder/Apfel.png" machst du dir die Plattformunabhängigkeit kaputt.

Korrekt mit der File-Klasse auf Dateien in Unterordnern auf der Festplatte zugreifen:

File homeDir = new File(System.getProperty("user.home"));
File appDir = new File(homeDir, "DeinAppVerzeichnis");
File imageFile = new File(appDir, "Apfel.png");

Ich empfehle, für dein Programm ein eigenes Verzeichnis im Homeverzeichnis anzulegen, wo du alle Dateien rein machst, die dein Programm so erzeugt und verarbeitet.

Nochmal: Keine Pfade als String hardcoden! Hier überhaupt keine Strings verwenden wegen dem Aufbau (wg "/dir/dir/file.txt" vs. "C:\dir\dir\file.txt", je nach OS). Die File-Klasse kümmert sich für dich um die OS-Eigenarten.

Um es anzulegen:

if ((!appDir.exist() && !appDir.mkdirs()) || !appDir.isDirectory()) {
	throw new IOException("unable to create app dir or app dir is not a dir.");
}

Um das Bild zu laden (wie auch immer du es zuvor in das Verzeichnis speicherst...):

BufferedImage image = ImageIO.read(imageFile);
if (image == null) throw new IOException("Failed to load image file");

Daraus das Swing-Icon erstellen ("Icon" ist hier etwas irreführend. Es geht auch ein ganz großes Icon ;)):

new ImageIcon(image);

Die IOException behandelst du etwa so:

try {
	//das alles von mir genannte kommt hier rein
	//den Code zum Zusammenbauen und Anzeigen der GUI kannst du der Überschtlcheit auch mithier rein machen, auch wenn dieser keine IOException wirft.
} catch (IOException ex) {
	//Dialog mit Fehlermeldung und Programmende
}

Zum fertigen Programm zusammenbasteln darfst du die Fragmente selber :P

Viel Glück.

Woher ich das weiß:Hobby
Mythxx103 
Fragesteller
 09.12.2021, 15:18

Also so ?

package com.company;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.ImageIcon;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Image extends JFrame {
JLabel displayfield;
    Image() {
        JFrame frame = new JFrame("Display Test");
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout());
        try {
            File homeDir = new File(System.getProperty("user.home"));
            File appDir = new File(homeDir, "DeinAppVerzeichnis");
            File imageFile = new File(appDir, "Apfel.png");
            displayfield = new JLabel(imageFile);
            if ((!appDir.exists() && !appDir.mkdirs()) || !appDir.isDirectory()) {
                throw new IOException("unable to create app dir or app dir is not a dir.");
            }
            BufferedImage image = ImageIO.read(imageFile);
            if (image == null) throw new IOException("Failed to load image file");
            frame.add(displayfield);
        } catch (Exception e) {
            System.out.println("Image cannot be found!");
            e.printStackTrace();
        }
        frame.pack();
        frame.setSize(1000, 500);
        frame.setVisible(true);

    }

    public static void main(String[] args) {
        Image gui = new Image();
    }


}
Geht irgendwie nicht :( :
java: no suitable constructor found for JLabel(java.io.File)
   constructor javax.swing.JLabel.JLabel(java.lang.String) is not applicable
     (argument mismatch; java.io.File cannot be converted to java.lang.String)
   constructor javax.swing.JLabel.JLabel(javax.swing.Icon) is not applicable
     (argument mismatch; java.io.File cannot be converted to javax.swing.Icon)
0