Bild hinzufügen zu GUI - JAVA?
Hallo, wie kann ich ein Bild in Java zu meinem JFrame hinzufügen?
Das habe ich bis jetzt, zeigt aber "File not found" an.
package com.company;
import javax.swing.*;
import javax.swing.ImageIcon;
public class Image extends JFrame {
Image() {
JFrame frame = new JFrame("Display Test");
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
try {
ImageIcon image = new ImageIcon(getClass().getResource("/home/marc/Bilder/Apfel.png"));
JLabel displayfield = new JLabel(image);
frame.add(displayfield);
} catch (Exception e) {
System.out.println("Image cannot be found!");
}
frame.pack();
frame.setSize(1000, 500);
frame.setVisible(true);
}
public static void main(String[] args) {
Image gui = new Image();
}
}
Muss ich bei "Name" das Verzeichnis, wie ich es getan habe, oder doch den Namen angeben ? Weder das eine noch das andere funktioniert. Ich benutze Linux Ubuntu, was wahrscheinlich eher keine Rolle spielt.
1 Antwort
- 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.
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)