AWT java.awt.FileDialog - "coffee cup"-Icon lässt sich nicht ersetzen

inflamer

Bekanntes Mitglied
Hallo Forum,

ich will statt dem JFileChooser die AWT-Variante des Dateiauswahldialoges verwenden, da sie "native" ist und für den User eher vertraut. Leider bekomme ich nach reichlich Googlen es nicht hin, das bekannte Java-Kaffeetassen-Icon darin entweder komplett zu entfernen oder durch ein eigenes Icon zu ersetzen.

Ich erzeuge die FileDialog-Instanz mit der Übergabe des "Haupt-"JFrame's als Konstruktorparameter, womit - nach meinem Verständnis zumindest - der FileDialog das Icon des JFrames bereits ohne weiteres automatisch übernehmen müsste, was jedoch nicht passiert.

Ferner funktionieren auch keine der beiden Varianten:
- setIconImage(Image)
- setIconImages(List<Image>)

Ist das ein Bug? Wenn ja, wie zu umgehen? JavaFX kommt nicht in Frage, da die Anwendung vollständig mit Swing läuft.
 
Da die native Komponente verwendet wird, waere gut zu wissen auf welchem System du sitzt. Eventuell wird dies dort nicht unterstuetzt (aus welchen Gruenden auch immer).
 
Eine "halbgare Zwischenlösung" wäre ja schon mal, wenn ich wüsste, wie ich dem aktuell noch verwendeteten JFileChooser wenigstens beibringe, dass er "C:\Benutzer" statt "C:\Users" und "Dokumente" statt "Documents" anzeigt...
 
Zuletzt bearbeitet:
Eine "halbgare Zwischenlösung" wäre ja schon mal, wenn ich wüsste, wie ich den JFileChooser wenigstens dazu bringe, dass er "C:\Benutzer" statt "C:\Users" und "Dokumente" statt "Documents" anzeigt...
Aber das ist doch eine Windows Spezialität, dass der Windows Explorer manche Verzeichnisse anders anzeigt, als sie wirklich heißen. Und das ist aus meiner Sicht mit der größte Unfug überhaupt. java liest nun einmal die Verzeichnisstruktur ein und da ist in c:\ kein Benutzer und kein Programme ...
Wenn Du so spezifische Windows Lösungen willst, dann nutze JNI um die Windows Dialoge zu nutzen... Dann hast Du da keine Probleme mehr - außer dass Du eine Applikation hast, die nur noch unter Windows läuft.
 
Aber das ist doch eine Windows Spezialität, dass der Windows Explorer manche Verzeichnisse anders anzeigt, als sie wirklich heißen. Und das ist aus meiner Sicht mit der größte Unfug überhaupt. java liest nun einmal die Verzeichnisstruktur ein und da ist in c:\ kein Benutzer und kein Programme ...
Wenn Du so spezifische Windows Lösungen willst, dann nutze JNI um die Windows Dialoge zu nutzen... Dann hast Du da keine Probleme mehr - außer dass Du eine Applikation hast, die nur noch unter Windows läuft.
Eben, das ist auch der Haken an JNI - von der zusätzlichen Dateigröße des Installationspackages mal auch noch abgesehen.

Wie ihr seht, bin ich da schon fast alles durch, wie es aussieht.
 
Die Anforderung ist so schlicht Quatsch. Du willst das Verhalten vom Windows Explorer. Aber wann verhält sich der Windows Explorer so und wann nicht? In welchen Versionen und bei welchen Settings verhält sich Windows so? Du kannst sowas gerne nachbauen, aber das wirft nur Probleme auf die Du nicht beheben können wirst.

Wenn die Anforderung so wirklich steht mit dem genauen Verhalten: Dann ist die Wahl bezüglich Java schon von vornherein Unsinn gewesen. Da hätte man mit C++ oder C# ran gemusst (Mit entsprechenden Plattform Libraries - also keine Cross Plattform Library, die dann die gleichen Probleme mit sich bringt....). Dann hättest Du das Windows Look and Feel wirklich gehabt. Cross Plattform Lösung -> Da hast Du sowas nur eingeschränkt.

Daher muss man bei sowas frühzeitig Anforderungen entsprechend bewerten. Produktowner mal entsprechend angesprochen? Wenn er das Feature so haben will, dann mach es mit JNI mit entsprechendem Preis. Dann kann er ja entscheiden, ob er das wirklich haben will, wenn es plötzlich so viel teuer ist...
(Ich selbst finde es etwas dubios. Ich erwarte eher, dass eine Anwendung in sich konsistent ist. Abweichungen zum Betriebssystem sind oft nicht wild, so dies nicht die Funktionalität betreffen. Aber wenn das Aussehen innen drin immer wechselt, dann wirkt das für mich etwas dubios und schlecht durchdacht. So ein Produkt würde ich eher nicht wählen, wenn ich die Wahl habe ...)
 
Sowohl der AWT FileDialog als auch der JFileDialog holen sich das Icon vom Parent-Fenster, die Executable hat damit nichts zu tun. Das funktioniert sowohl in Java 1.8 als auch in Java 15.

Poste mal den Code, wo du a) das Fenster erzeugst und b) den Dialog öffnest.

Falls du die Begriffe "user" übersetzt sehen willst, wirst du dir ein eigenes Fileview schreiben oder z.B. über JNA auf den WindowsFile Dialog Comdlg32.GetOpenFileName(...) zugreifen müssen.


Auch der holt sich das Icon aus dem Parent, hat aber seine eigenen Tücken (z.B. kannst du den Pfad nur ein einziges Mal setzen, in Folge wird - egal was du setzt - beim nächsten Aufruf der vorige Pfad verwendet, das ist von MS so gewollt).
 

@Neumi5694


Habe hier mal eine kleine Test-Klasse geschrieben, um auch für mich selbst herauszufinden, ob das Kaffee-Icon vielleicht nur in meiner Anwendung nicht ersetzt wird, dem scheint aber nicht so zu sein: Auch die Test-Klasse liefert dasselbe Ergebnis:

Java:
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;


public class Test {

  public static void main(String[] args) {

    BufferedImage img = null;
    try {
      img = ImageIO.read(new File("C:/Users/admin/Desktop/icon.png"));
    } catch (Exception e) {}

    JFrame frame = new JFrame();
    frame.setIconImage(img);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(100, 100, 800, 600);
    frame.setVisible(true);

    FileDialog fileDialog = new FileDialog(frame);
    fileDialog.setVisible(true);
  }

}

Ergebnis:

Andererseits: Vielleicht mach ich ja in beiden Fällen etwas falsch - das kann ja auch sein.
 
Zuletzt bearbeitet:
Habe deinen Code gerade auf Java 15 und 16 laufen lassen, da wird das Icon angezeigt. Natürlich hab ich einen anderen Dateipfad verwendet.
Hab zum Testen auch eine große png-Datei verwendet (512 pixel), klappt problemlos, das Icon wird im Dialog angezeigt.
dialogicon.PNG
Sprich: Am Code ist nichts falsch.
Warum's dann nicht klappt ...
Welche Java-Version verwendest du?


ps: Probier's auch mal mit dem JFileChooser.
Ich seh gerade, du verwendest ein anderes Windows als ich und da AWT ja auf Native zurückgreift ...
Versuche auch, ein GIF zu verwenden und/oder die Größe auf 16 Pixel zu beschränken.
Java:
public class TestJavaCup {
    public static void main(String[] args) {
        try {
            File f = new File("D:/IconLarge.png");
            JFrame fr = new JFrame("ThisIsATitle");
            fr.setIconImage(ImageIO.read(f));
            fr.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            JButton bAwt = new JButton("AWT Dialog");
            bAwt.addActionListener(e -> {
                FileDialog fd = new FileDialog(fr, "thisisatitle");
                fd.setDirectory("c:\\");
                fd.setVisible(true);
            });
            JButton bSwing = new JButton("Swing Dialog");
            bSwing.addActionListener(e -> {
                JFileChooser fc = new JFileChooser();
                fc.setCurrentDirectory(new File("c:\\"));
                fc.showOpenDialog(fr);
            });
            JPanel holder = new JPanel(new GridLayout(2, 1));
            holder.add(bAwt);
            holder.add(bSwing);
            fr.setContentPane(holder);
            fr.pack();
            fr.setLocationRelativeTo(null);
            fr.setVisible(true);
        } catch (IOException ex) {
            Logger.getLogger(TestJavaCup.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
 
Zuletzt bearbeitet:
Hmm, vielleicht liegt's tatsächlich an der Java-Version, ich teste hier nämlich (da daran gebunden) mit dem Java 8 von Oracle, und zwar einmal in x86 und einmal x64.

Habe deinen Code genommen und dort stumpf erst eine 16x16 GIF reingesetzt, dann eine 512x512 PNG. Ergebnis: Leider wie gehabt. JFileChooser zeigt wie immer verlässlich das Icon des Parents an, FileDialog hingegen bleibt bei seiner alten Leier mit der Kaffee-Tasse.

Aber ich bin eh mittlerweile soweit, den FileDialog als Variante fallen zu lassen, da er obendrauf auch noch veraltete Windows-Dialoge nutzt bzw. anzeigt. Es gibt da stattdessen eine kleine nette Lib Namens XFileDialog, die neuere und modernere Dialoge von Windows nutzt. Werde mich wohl erstmal darauf konzentrieren.

Danke Dir für die Antwort!
 
Zuletzt bearbeitet:
Gerne. Ich arbeite beruflich an einem JDK8 Projekt, da hab ich mit dem Swing-Dialog kein Problem, hatte nur leider in dem Moment keine JDK auf dem Rechner installiert. Ich bin neugierig, was AWT dazu sagt, morgen probier ich's mal.
XFileDialog ... muss ich mal ausprobieren, aktuell steuer ich die direkt über JNA an.
 
Du hattest Recht, es liegt tatsächlich an Java 8.
Während Swing und der JNA-Dialog (Comdlg32.GetOpenFileName) das Icon anzeigen, fehlt es beim AWT-Dialog.
 

Zurück
Oben