Wozu Observer?

beastofchaos

Bekanntes Mitglied
Hallölle Leute,
Ich hab folgende Frage: Wozu benötigt ein Image einen Observer, wenn ich z.B. die "Size" ermitteln will?

Ich hab ein Zeichenprogramm und zeichne immer wieder auf ein Bild - Im Moment benutze ich wegen ein paar Änderungen als Observer ein JPanel, auf welchem das Bild gar nicht angzeigt wird? In welchem Fall könnte das ein Problem? Wenn das nämlich egal wäre(was es sicher nicht ist), köntne man schließlich ein observer imemr ein "new JPanel()" o.ä. einsetzen...
Meine (kühne) bisherige Vermutung ist, dass bei einem "repaint()", ausgelöst durch Fenster Verschieben oder Vergößern, er auch die Anzeigefläche des Bildes braucht, um es anzupassen oder so(?)

Freue mich auf die große Erleuchtung :D
Gruß, Thomas
 

Marco13

Top Contributor
Das mit dem ImageObserver ist so eine Sache... ich programmiere seit... pffff... 15 Jahren oder so Java, und hab' noch nie wirklich einen benutzt :D Der ist wohl eine Mischung aus veralteter API und Spezialfällen wie "animierten GIFs"... Aber... in den ALLERmeisten Fällen hat man ohnehin nur BufferedImages, und die brauchen keine Observer (d.h. es gibt getWidth() auch ohne Observer, und bei g.drawImage(image,0,0,observer) kann man als 'observer' einfach 'null' übergeben).
 
A

anonym

Gast
Du lädst deine Bilder offenbar asynchron. Das bedeutet: Sie werden nicht sofort in den Hauptspeicher geladen, sondern erstmal auf der Festplatte gelassen. Geladen werden sie erst, wenn sie wirklich gebraucht werden.
Das ist eine coole Idee, denn Festplattenzugriffe sind ziemlich langsam und so wartet dein Code nicht, dass das Bild geladen ist. Der ImageObserver hat eine Methode, die dann angesprochen wird, wenn das Bild geladen ist. Wenn sich alle anderen Klassen korrekt verhalten, kannst du sicher irgendwas nehmen. Ich würde allerdings kein JPanel nehmen, dass ist zu teuer in der Initialisierung.

Check mal, ob lazy load in deiner Implementierung Sinn macht. Andernfalls nimm doch ImageIO.read zum Laden, dann hast du ein BufferedImage, das sicher vollkommen im Speicher steht.
 

beastofchaos

Bekanntes Mitglied
Jep, ich benutze eigentlich auch nur BufferdImages, aber ich hab halt den Code an manchen Stellen dem noch nicht angepasst :D Werd ich gleich mal machen.
Bisher hab ich anfangs immer das Problem, dass ich per Timer ein paarmal repaint() aufrufen muss, damit das erstellte Bild, das er immer anzeigt, auch mit der vollen Größe des Panels geladen werden kann. Das liegt aber leider daran, dass mein JPanel offensichtlich ein paar Hunderstelsekunden braucht, um sich vollständig aufzubauen :/
 

Michael...

Top Contributor
Im Moment benutze ich wegen ein paar Änderungen als Observer ein JPanel, auf welchem das Bild gar nicht angzeigt wird?
Wenn, dann sollte man als Observer auch die Komponente angeben auf der das Bild angezeigt wird. Was interessiert ein beliebiges Panel die Zustände und Informationen zu einem Bild mit dem es gar nichts zu tun hat.
Was ja nicht welche Bilder Du da lädst und wie groß diese sind. Heutzutage lädt man Bilder meistens direkt und komplett. Java bietet verschiedene Möglichkeiten Bilder zu laden, so dass der restliche Code "wartet" bis diese komplett im Speicher sind. MediaTracker, ImageIO, ImageIcon
 

beastofchaos

Bekanntes Mitglied
Dass ich als Observer ein sinnloses Panel benutzt habe, war, weil ich durch neue Änderung das eigentliche Zeichen-Panel als private Unterklasse eingebaut habe.
Aber da ich nun einheitlich nur BufferedImages benutze, hat sich nun das Problem der Observer geklärt ;)

Ich lade die Bilder entweder aus Dateien (über ImageIO) oder aus dem Clipboard. Das funktioniert auch alles.

Wegen dem Timer und mehrmals zeichnen:
Java:
        private void initDrawLevel(){
	    	selection = new SelectionDesign(CenterPanel.this, new Point(0, 0), new Point(0, 0), SelectionDesign.RECTANGLE);
	    	
	        int delay = 100;
	        ActionListener taskPerformer = new ActionListener() {
	            public void actionPerformed(ActionEvent evt) {
	            	if (initCounter > 5){
	            		process.add(paints.copy());                      // 1. Element einer ArrayList, die ich für Undo-/Redo-Funktionen benutze
	            		actPos++;                                        // Aktuelles Bild aus der ArrayList, das angezeigt wird
	            		initPaints.stop();
	            	}
	            	else {
	            		painter.repaint();
	            		initCounter++;
	            	}
	            }
	        };
	        initPaints = new Timer(delay, taskPerformer);
	        initPaints.start();
	    }

Mein weißes Bild, auf dem gezeichnet wird muss die Größe des Zeichenpanels übernehmen, welches eig. bei mir nicht sofort geladen ist (auch bei Benutzung von invokeLater()). So war es zumindest am Anfang. btw: In paintComponent() wird geprüft, ob (Bild == null) ist. Wenn ja, dann wird das Bild erstellt mit den benötigten Größen.
Ich hab jetzt einfach mal versucht den Timer wegzunehmen und es funktioniert tatsächlich :D
Bloß leider muss ich das Erstellen des Bildes in paintComponent lassen, weil wenn ich das direkt in meiner angegeben Methode ("initDrawLevel()") wirft er die Exception:
"java.lang.IllegalArgumentException: Width (-100) and height (-100) cannot be <= 0"

Weil das Panel halt an der Stelle noch bei den Werten -100, -100 ist :/ Aber wenigstens kann ich den Timer weglassen ;)

Gruß, Thomas

edit:
Ich hätte da noch eine Frage und zwar wirft mein Progrmam manchmal beim Beenden eine InterruptedException. Ich benutze zum Beenden "System.exit(0)".
Ich muss den X-Button außer Gefecht setzen, damit eine "Speichern-Abfrage" kommt, falls noch nicht gespeichert worden ist. Wie werde ich die InterruptedException los?

edit2:
ein "dispose()" :D
 
Zuletzt bearbeitet:

Michael...

Top Contributor
edit:
Ich hätte da noch eine Frage und zwar wirft mein Progrmam manchmal beim Beenden eine InterruptedException. Ich benutze zum Beenden "System.exit(0)".
Ich muss den X-Button außer Gefecht setzen, damit eine "Speichern-Abfrage" kommt, falls noch nicht gespeichert worden ist. Wie werde ich die InterruptedException los?
Da läuft wohl irgendwo noch ein pausierender/schlafender Thread.
edit2:
ein "dispose()" :D
Damit verschwindet zwar das Fenster, aber die JVM läuft weiter - wenn man genug Resourcen auf dem Rechner hat ist es ja nicht so schlimm ;-)
 
S

Stefan Hillmann

Gast
Wenn Du aktionen beim Beenden des Fenstes ausführen willst, wie z.B. das Prüfen ob die Daten gespeichert sind, solltest du dir mal WindowListener und WindowAdapter anschauen
 

beastofchaos

Bekanntes Mitglied
Genau die benutze ich ja auch...
Falls es aber nicht beendet werden soll, musste ich das einbauen
Java:
    window.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

Und so sieht dann mein WindowListener aus:
Java:
    private class WindowAction extends WindowAdapter{
        @Override
        public void windowClosing(WindowEvent ev){
            try {
                if (!actions.saved){                 // wurde nochmal gezeichnet seit dem letzten Speichervorgang?
                    int answer = JOptionPane.showConfirmDialog(null, Languages.get("SaveQuestion"), Languages.get("ExitQuestionHeader"), JOptionPane.YES_NO_CANCEL_OPTION);
                    if( answer == JOptionPane.YES_OPTION ){
                        if (actions.save(null)){             // Methode, die das aktuelle Projekt in einem JFileChooser speichern lässt
                        	exitProgram();
                        }
                        else {
                            return;                 // Wenn im JFileChooser Abbrechen gedrückt wurde oder sonst was nicht funktioniert, kehrt er zum Programm zurück
                        }
                    }
                    else if (answer == JOptionPane.NO_OPTION){
                    	exitProgram();
                    }
                }
                else {
                	exitProgram();
                }
            }catch (Exception e){ }
        }
    }
    
    private void exitProgram(){
    	dispose();
    	System.exit(0);
    }

Funktioniert jetzt auch... keine Exception bei den letzten Malen. Mit dispose() löse ich das Fenster auf und das wiederum enthält einen Timer und ein paar anderere JPanel die doch dann mit zerstört werden.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Wozu dient Interfaces? Java Basics - Anfänger-Themen 6
berserkerdq2 Wozu benötigt man den BiPredicate, kann ich nicht einfach eine normale Methode nutzen, statt BiPredicate? Java Basics - Anfänger-Themen 3
N Wozu nutzt man in der Main Methode das args Array? Java Basics - Anfänger-Themen 10
S Vererbung Abstrakte Methoden: Wozu das Ganze?! Java Basics - Anfänger-Themen 7
W Stackabarbeitung - Wozu dient das "True" ? Java Basics - Anfänger-Themen 1
R Wozu sind Annotations da? Java Basics - Anfänger-Themen 3
H abstract - Wozu? Java Basics - Anfänger-Themen 6
T Erste Schritte Endlosschleife & wozu braucht man /* und */ Java Basics - Anfänger-Themen 19
V OOP Wozu Objekt erstellen? Java Basics - Anfänger-Themen 2
G Wozu ist die Methode offsetByCodePoints(int, int) beim StringBuilder sinnvoll? Java Basics - Anfänger-Themen 1
G wozu dient getContentPane()? Java Basics - Anfänger-Themen 1
M Wozu Upcasting? Am Beispiel List = ArrayList Java Basics - Anfänger-Themen 2
P Wozu brauche ich (this.)? Java Basics - Anfänger-Themen 3
F Wozu braucht man array list? Java Basics - Anfänger-Themen 29
U Wozu dient ein Vector in Java? Java Basics - Anfänger-Themen 6
D Sinn von Interfaces - Wozu? Java Basics - Anfänger-Themen 9
J Datentypen Array in enum, ?? Wozu ?? Java Basics - Anfänger-Themen 3
J Wozu werden die anonyme Klassen verwendet? Java Basics - Anfänger-Themen 9
F Wozu ist Java gut? Java Basics - Anfänger-Themen 7
H Maps? Wozu? Nutzen? Java Basics - Anfänger-Themen 3
0 Wozu braucht man Generics? Java Basics - Anfänger-Themen 1
V wozu ist das 'L' beim long notwendig ? Java Basics - Anfänger-Themen 5
A wozu ant? Java Basics - Anfänger-Themen 12
S Wozu dient die Main Class? Java Basics - Anfänger-Themen 3
Y Wann / Wozu inner class Java Basics - Anfänger-Themen 3
S Desginfrage Interface - aber wozu eigentlich? Java Basics - Anfänger-Themen 2
E Wozu dienen Schnittstellen? Java Basics - Anfänger-Themen 16
N Wozu Applications? Java Basics - Anfänger-Themen 8
M Methode bekommt ein Objekt der Klasse als Parameter. Wozu? Java Basics - Anfänger-Themen 4
R Wozu sind Interfaces gut? Java Basics - Anfänger-Themen 14
B Hashcode?Was ist das und wozu? Java Basics - Anfänger-Themen 2
R Wozu Interfaces ? Java Basics - Anfänger-Themen 5
G Konstruktoren (was, wozu, wieso, warum) Java Basics - Anfänger-Themen 4
J Methoden Observer-Pattern mit Consumer und accept( ) Java Basics - Anfänger-Themen 6
J Implementierung von Observer und Singleton-Pattern Java Basics - Anfänger-Themen 9
fLooojava MVC Pattern und Observer Pattern Java Basics - Anfänger-Themen 6
Y Observer update Java Basics - Anfänger-Themen 3
N Observer funktioniert nicht Java Basics - Anfänger-Themen 13
G Observer löst zweimal aus Java Basics - Anfänger-Themen 8
A ein observer "post"problem Java Basics - Anfänger-Themen 3
A Observer Pattern Problem Java Basics - Anfänger-Themen 15
J Interface Frage zu Interfces am Beispiel Observer Pattern Java Basics - Anfänger-Themen 8
F Observer Java Basics - Anfänger-Themen 7
U observer thread safe Java Basics - Anfänger-Themen 4
Helgon Observer Pattern - hasChanged() immer false Java Basics - Anfänger-Themen 10
Spin Observer Patteern java Java Basics - Anfänger-Themen 7
O Liste - Observer/Observeable - HashMap Hilfe Java Basics - Anfänger-Themen 19
C OOP Observer Pattern Java Basics - Anfänger-Themen 2
O Observer - Einfach erklärt? Java Basics - Anfänger-Themen 5
K Observer Pattern notifyObservers Java Basics - Anfänger-Themen 9
P Fragen zum Observer Muster und Datenbanken Java Basics - Anfänger-Themen 2
T Observer ansprechen Java Basics - Anfänger-Themen 2
R Observer funktioniert nicht. Sehe keine Fehler Java Basics - Anfänger-Themen 2
W Observer-Pattern Java Basics - Anfänger-Themen 3
hdi JList mit Model und Observer -> Chaos, blicke nicht durch Java Basics - Anfänger-Themen 22
hdi Observer als statische Klasse ? Java Basics - Anfänger-Themen 2
N observer frage Java Basics - Anfänger-Themen 2
G Implementierung des Observer/Observable Patterns - Gut so? Java Basics - Anfänger-Themen 3
N observer Java Basics - Anfänger-Themen 12
H [erledigt] Observable/Observer Beobachter entfernen Java Basics - Anfänger-Themen 2
G Unterschied Observer&Observable<->java.beans.Prope Java Basics - Anfänger-Themen 4
G Benötige Hilfe bei Problem mit Observer! Java Basics - Anfänger-Themen 2
E Observer Java Basics - Anfänger-Themen 7
K Observer Observable update() . Java Basics - Anfänger-Themen 13
T Verständnisfrage Observer-Pattern Java Basics - Anfänger-Themen 8
Y Observer - notifyObservers(Object arg) Java Basics - Anfänger-Themen 4
M Servlets und Observer Java Basics - Anfänger-Themen 2
G Observable/Observer-Patterns Java Basics - Anfänger-Themen 9
S Observer Pattern notifyObserver Java Basics - Anfänger-Themen 6
M Observer Pattern Java Basics - Anfänger-Themen 14
A MVC Observer Pattern Java Basics - Anfänger-Themen 2
G Observable/Observer update wird nicht ausgeführt Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben