 |
04.12.2005, 17:03
| Nach oben
#1 | | Gast | JFileChooser in einem Frame mit JInternalFrames, zeichnet sich nicht
Hallo!
Ich hab ein echt ärgerliches Problem mit dem JFileChooser von Java. Denn wenn ich diesen starte, dann zeichnet der weder sein eigenes Fenster korrekt, noch den hintergrund.
Ich hab hier ein kleines bild angehängt, wie das aussieht.
Schon mal vielen lieben dank für die hilfe im voraus! | |
| |
04.12.2005, 17:15
| Nach oben
#2 | | Sesselkleber
Registriert seit: 17.01.2005
Beiträge: 582
|
1. geil zu wissen, dass du DSA spielst
2. kann es sein, dass du AWT und Swing Componenten mischt? Dann kommt es immer zu den seltsamsten Fehlern.
Wenn dem nicht so ist, zeig bitte mal ein wenig Code wie du den JFileChooser aufrufst.
Gruß
Sparrow
|
| |
04.12.2005, 17:23
| Nach oben
#3 | | Gast | //////////////////////////////////////////////////
Hehe, was diese kleinen testbildchen immer über eine person verraten, was?
Spielst du etwa auch?
Jedenfalls ist hier der Quellcode. Die imho interessanten Stellen sind mit ganz tollen kommentaren gekennzeichnet, wie etwa hier:
//////////////////////////////////////////////////
// ############################
Wegen AWT/Swing habe ich jetzt nochmal nachgesehen - nein da ist sicherlich nichts von AWT drinnen (außer die notwendigen sachen wie Rectangle, Point, etc.) PHP-Code: package metePaint;
import javax.swing.*; import javax.swing.event.*; import javax.swing.filechooser.FileFilter;
import metePaint.imageWindow.*; import metePaint.informationWindow.*; import java.awt.*; import java.awt.event.*; import java.io.File;
import ij.*; import ij.gui.HistogramWindow;
public class MetePaint extends JFrame implements InternalFrameListener {
protected JDesktopPane desktop; protected static ImageWindow lastFocusedImage; protected static MetePaint me; protected static JMenuBar mainMenu; protected static JMenuItem importOption, saveOption, loadOption; protected int pluginOffset=5; protected class ImageFilter extends FileFilter {
protected String allowed[]={"tif","bmp","jpg","gif","png"}; // This method is from the JAVA tutorial. // http://java.sun.com/docs/books/tutorial/uiswing/components/example-1dot4/ImageFilter.java protected String getExtension(File f) { String ext = null; String s = f.getName(); int i = s.lastIndexOf('.');
if (i > 0 && i < s.length() - 1) { ext = s.substring(i+1).toLowerCase(); } return ext; } public boolean accept(File f) { if(f.isDirectory()) return true; String ext=getExtension(f); for(int i=0; i<allowed.length;i++) { if(allowed[i].equals(ext)) return true; } return false; }
public String getDescription() { return "Nur Bilder"; } } ////////////////////////////////////////////////// // ############################ protected class ImportOptionAction extends AbstractAction {
public ImportOptionAction() { super("Importieren"); } public void actionPerformed(ActionEvent e) {
////////////////////////////////////////////////// // ############################ JFileChooser filePicker=new JFileChooser(); filePicker.setFileFilter(new ImageFilter()); int res=filePicker.showOpenDialog(me);
if(res!=JFileChooser.APPROVE_OPTION) return; // User pressed cancel or closed the window. File f=filePicker.getSelectedFile(); loadPicture(f.getName(),f.getAbsolutePath()); } } public MetePaint() { super("METE Paint"); me=this; this.setDefaultCloseOperation(EXIT_ON_CLOSE); ////////////////////////////////////////////////// // ############################ desktop=new JDesktopPane(); desktop.setBackground(Color.GRAY); this.setContentPane(desktop); this.setSize(1024,768); //importOption=new JMenuItem(new ImportOptionAction()); mainMenu=new JMenuBar(); JMenu file = new JMenu("Datei"); file.add(new ImportOptionAction()); mainMenu.add(file); //mainMenu.add(importOption); this.setJMenuBar(mainMenu); loadPicture("media/dsa.jpg"); loadPicture("media/aventurien.jpg"); HistogramInformationWindow h = new HistogramInformationWindow(); loadPlugin(h); loadPlugin(new ResizerWindow()); //h.repaint(); this.setVisible(true); } protected void loadPlugin(InformationWindow w) {
w.setBounds(this.getWidth()-w.getWidth()-10,pluginOffset,w.getWidth(),w.getHeight()); pluginOffset+=w.getHeight(); desktop.add(w); } public void loadPicture(String name,String path) { IJ.open(path); lastFocusedImage=new ImageWindow(name,IJ.getImage()); desktop.add(lastFocusedImage); lastFocusedImage.moveToFront(); } public void loadPicture(String path) { loadPicture(path,path); }
public static MetePaint getApp() { return me; } public static ImageWindow getActiveImageWindow() { return lastFocusedImage; }
public static void main(String[] args) { MetePaint m=new MetePaint();
}
public void internalFrameActivated(InternalFrameEvent e) { JInternalFrame i=e.getInternalFrame(); if(i instanceof ImageWindow) lastFocusedImage=(ImageWindow)i; }
public void internalFrameClosed(InternalFrameEvent arg0) {}
public void internalFrameClosing(InternalFrameEvent arg0) { }
public void internalFrameDeactivated(InternalFrameEvent arg0) { }
public void internalFrameDeiconified(InternalFrameEvent arg0) { }
public void internalFrameIconified(InternalFrameEvent arg0) { }
public void internalFrameOpened(InternalFrameEvent arg0) { }
}
| |
| |
04.12.2005, 17:43
| Nach oben
#4 | | Projektleiter
Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.160
|
Hmm... also das auffälligste, was ich finden konnte, war das hier: Code: int res=filePicker.showOpenDialog(null);
Im Idealfall solltest du da eine Instanz eines JFrames statt "null" übergeben.
Beispiel: Code: int res=filePicker.showOpenDialog(MetePaint.this);
(du kannst nicht direkt auf "this" zugreifen, weil du ja eine innere Klasse verwendest)
|
| |
04.12.2005, 17:53
| Nach oben
#5 | | Gast |
Nunja, das stimmt allerdings, nur das ist nicht der fehler - ursprünglich sah der code so aus, wie von dir vorgeschlagen, ich hatte das nur zu testzwecken geändert. Hat allerdings leider nichts bewirkt.
| |
| |
04.12.2005, 18:08
| Nach oben
#6 | | Sesselkleber
Registriert seit: 17.01.2005
Beiträge: 582
|
Kapsel das was passieren soll (also das öffnen) in eine eigene Methode und ruf nur die Methode aus dem ActionEvent aus.
Also in etwa so:
ab Zeile 75: PHP-Code: public void actionPerformed(ActionEvent e) {
//////////////////////////////////////////////////
// ############################
openFilePicker();
}
Und dann an anderer Stelle im Code, entsprechend als private Klassenmethode: PHP-Code: private void openFilePicker() {
JFileChooser filePicker=new JFileChooser();
filePicker.setFileFilter(new ImageFilter());
int res=filePicker.showOpenDialog(this);
if(res!=JFileChooser.APPROVE_OPTION) return;
// User pressed cancel or closed the window.
File f=filePicker.getSelectedFile();
loadPicture(f.getName(),f.getAbsolutePath());
}
Vielleicht funktioniert es so, ich trau der Unterbringung direkt im actionPerformed() immer nicht.
PS:
Hab jahrelang DSA gespielt, ist inzwischen aber (leider) ziemlich eingschlafen.
Gruß
Sparrow
|
| |
04.12.2005, 18:47
| Nach oben
#7 | | Gast |
hm ne, das hilft auch nicht? Könnte es irgendwas mit "Thread Safety" zu tun haben? Das ist das einzige, was mir dazu sonst noch einfällt...
| |
| |
04.12.2005, 20:05
| Nach oben
#8 | | Projektleiter
Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.160
|
Nee... Listener werden automatisch im EDT ausgeführt... also mir fällt ehrlich gesagt auch nichts ein.
|
| |
04.12.2005, 22:21
| Nach oben
#9 | | Gast |
Problem gelöst.
Der Auslöser lag wo anders - hatte an einer anderen Stelle ein bild verwendet, dass einen falschen ImageObserver verwendete. Dadurch ist das bild ständig neugezeichnet worden und hat die JVM einfach so sehr verlangsamt, dass alle anderen Repaints viel zu kurz kamen und der JFileChooser deshalb auch so lange zu laden benötigte.
| |
| | |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | | | | Themen-Optionen | Thema durchsuchen | | | |
Forumregeln
| Es ist dir nicht erlaubt, neue Themen zu verfassen. Es ist dir nicht erlaubt, auf Beiträge zu antworten. Es ist dir nicht erlaubt, Anhänge hochzuladen. Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten. HTML-Code ist aus. | | | Alle Zeitangaben in WEZ +1. Es ist jetzt 22:45 Uhr.
|