Hilfe! Command Pattern an easy ImageViewer?

Status
Nicht offen für weitere Antworten.

geneticZ

Bekanntes Mitglied
Hallo allerseits,
ich lerne und übe derzeit "Design Patterns" und habe mir bezüglich dessen die Aufgabe gestellt, das Command Pattern an einem einfachen ImageViewer auszuprobieren. Hierzu entstehen bei mir ein paar Fragen die ich hoffe mit Hilfe des Forums klären zu können.

Das ganze habe ich auch schon gecoded und es funktioniert auch, ich bin mir aber nicht sicher ob mein Lösungsansatz eher umständlich, richtig oder gar falsch ist. Derzeit beschrenke ich mich ausschließlich auf den OpenFile - Befehl als JMenuItem...

Es gibt ja, bitte verbessert mich wenn ich da falsch liege, mehrere Möglichkeiten das Commandpattern in Swing und Events etc einzusetzen: Als simplen ActionListenerEvent, mittels AbstractAction und dann eben so wie ich das jetzt probiert habe über ein Command Interface. Das Command Interface habe ich auch wegen einer Undo-Methode verwendet, die ich aber erst später einbauen will.

Ich würde mich freuen wenn jemand meinen, dann doch sehr langen Post, lesen, wenn nötig verbessern oder mir ein paar Tips geben könnte. Vielen Dank schonmal für eure Mühe.
Gruß
geneticZ

Java:
//Das Command Interface
public interface Command {
	public void execute();
}
Java:
//Mein ConcreteCommand
public class OpenImageCmd implements Command{
	private ImageComponent viewComponent;
	
	public OpenImageCmd(ImageComponent im){
		this.viewComponent = im;
	}
	
	public void execute() {
		JFileChooser fc = new JFileChooser(System.getenv("User"));
		fc.setFileFilter(new FileNameExtensionFilter("*.jpg;*.gif", "jpg", "gif"));
		fc.showOpenDialog(viewComponent);
		final File file = fc.getSelectedFile();
		
		if(file != null){
			new SwingWorker<BufferedImage, Void>(){
				@Override
				protected BufferedImage doInBackground() throws IOException {
					return ImageIO.read(file);
				}
				@Override
				protected void done(){
					try{
						viewComponent.setImage(get());
					}
					catch(Exception e){}
				}
			}.execute();
		}
	}
}
Java:
//Mein Invoker
public class OpenImage extends JMenuItem implements ActionListener{
	Command cmd;
	
	public OpenImage(Command c){
		super("Open");
		this.cmd = c;
		this.addActionListener(this);
	}
	
	public void actionPerformed(ActionEvent e) {
		cmd.execute();
	}
}
Java:
//Mein Client
import java.awt.event.*;
import javax.swing.*;

public class win extends JFrame{
	JMenuBar menuBar;
	JMenu menu;
	JMenuItem menuItem;
	JPanel contentPane;
	
	Command openImage;
	
	public win(){
		contentPane = (JPanel) getContentPane();
		contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
		
		ImageComponent im = new ImageComponent();
		Command openImage = new OpenImageCmd(im);
				
		menuBar = new JMenuBar();
		
		menu = new JMenu("File");
		menuBar.add(menu);
		
		menuItem = new OpenImage(openImage);
		menu.add(menuItem);
		
		setJMenuBar(menuBar);
		
		contentPane.add(new JScrollPane(im));
		
	}
	
	public static void main(String[] args) {
		JFrame frame = new win();
		frame.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);				
			}
		});
		frame.pack();
		frame.setVisible(true);
	}
}
Java:
//Mehr oder weniger mein Reciever bzw die Image Paint Methode
public class ImageComponent extends JComponent {   
	private BufferedImage image; 
	
	public void setImage( BufferedImage image ) {     
		this.image = image;  
		
		setPreferredSize( new Dimension(image.getWidth(), image.getHeight()));
		repaint();    
		invalidate();   
	}   
	
	@Override   
	protected void paintComponent( Graphics g ){
		
		if ( image != null )
			g.drawImage( image,
					((getWidth()/2) - (image.getWidth()/2)),
					((getHeight()/2) - (image.getHeight()/2)),
					this); 			
	} 
}
 
G

Gast2

Gast
Jop ich glaub das passt so...
Jetzt kannst du noch Methoden für undo/redo einführen..

Ich würde den FileChooser nur einmal im Kontruktor erzeugen nicht jedesmal neu.
Dann springt der FileChooser auch dort hin wo der User ihn zuletzt geöffnet hat.
 

geneticZ

Bekanntes Mitglied
Hey super! Danke dass du mal drüber gesehen hast!
Das mit dem FileChooser bau ich gleich um...
Kannst du mir sagen warum die JScrollPane im contentPane erst nach einmaligen klick auf's Bild aufpopt?
 
G

Gast2

Gast
2 Sachen ab Java 1.5 brauchst du die Componenten nicht mehr auf getContentPane adden es reicht ein normales add...
Der WindowListener ist auch überflüssig es reicht die Methode setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)...
Debug mal durch eventuell stimmt deine PreffredSize nicht...

Des weiteren würde ich so zeichnen
Java:
protected void paintComponent(Graphics g) {
  super.paintComponent(g);
  final Insets insets = getInsets();
  final int x = insets.left;
  final int y = insets.top;
  final int width = getWidth() - x - insets.right;
  final int height = getHeight() - y - insets.bottom;
  g.drawImage(img, x, y, width, height, this);
}
 
Zuletzt bearbeitet von einem Moderator:

geneticZ

Bekanntes Mitglied
HI,
was für Vorteile bringt mir das ein wenn ich das Bild so zeichne?
Ok, ich sehe gerade dass das mein Bild nicht zentriert sondern so groß zeichnet wie der Container ist.
Das will ich aber gar nicht unbedingt...

Das ScrollPane Problem hab ich leider immernoch. Aus irgend nem Grund wird setPrefferedSize erst aufgerufen wenn ich auf den Rahmen meines Fensters klicke. :(
 
Zuletzt bearbeitet:
G

Gast2

Gast
Ja kannst ja trotzdem das /2 einmachen dann ist es wieder zentriert...

Ja ist logisch wenn du auf dein Fenster klickt macht er ein repiant vom frame...
wenn du setImage machst musst du dein JFrame repainten weil dieser regelt die Größe des ImageComponent nicht repaint auf ImageComponent aufrufen...


Könntest eventuell gleich das nächste Pattern lernen ...
ObserverPattern...
das JFrame registriert sich als Listener an deinem Panel und das Pnael schmeißt bei setImage ein Event worauf sich das JFrame repainted...
 
Zuletzt bearbeitet von einem Moderator:

geneticZ

Bekanntes Mitglied
Könntest eventuell gleich das nächste Pattern lernen ...
ObserverPattern...

Klingt jetzt vielleicht blöd, aber genau das hatte ich vor...
Observer Pattern wäre mein nächstes gewesen. :)
Schonmal vielen Dank! Du bist mir echt ne große Hilfe!

Edit: Ok, hier stoß ich jetzt auf ein Problem. Ich kapier absolut nicht wie ich das umsetzen kann?

Gruß
geneticZ
 
Zuletzt bearbeitet:

geneticZ

Bekanntes Mitglied
Muss ich dann erstmal den Panel abkapseln?
[Java]
public class ObsPane extends JPanel{
Observable notifier = new ObsBox();
}
[/Java]
[Java]
public class ObsBox extends Observable {
public void notifyObservers(Object b) {
setChanged();
super.notifyObservers(b);
}
}
[/Java]
Oder wie soll das laufen?
 
G

Gast2

Gast
Muss ich dann erstmal den Panel abkapseln?
[Java]
public class ObsPane extends JPanel{
Observable notifier = new ObsBox();
}
[/Java]
[Java]
public class ObsBox extends Observable {
public void notifyObservers(Object b) {
setChanged();
super.notifyObservers(b);
}
}
[/Java]
Oder wie soll das laufen?

Jop...
aber das setChanged musst du in deiner setImage Methode aufrufen

Später kannst du dir auch eigene Listener schreiben
 

geneticZ

Bekanntes Mitglied
Sorry ich checks nicht.
Wie bekomme ich die setChanged() denn in die setImage Methode?
.... und wie add ich die JFrame - Klasse als Observer?
Ich blick überhaupt nicht durch :(
 
Zuletzt bearbeitet:
G

Gast2

Gast
Mal ein Denkansatz ungefähr

Java:
public class ObsPane extends JPanel{
Observable notifier = new ObsBox();

void setImage(Image image){
this.image = image;
notifier .setChanged();
notifier.notify();
}
}

beim Frame machst implements Obsverable

und machst macht panel.addObserver
 

geneticZ

Bekanntes Mitglied
Also ich komm hier leider nicht weiter... :(

Ich sehe momentan zwei Möglichkeiten wie ich das Observer Pattern implementieren kann, leider hänge ich immer an einer Stelle.
Zum einen könnte ich quasi in der Main-Methode als erstes ein Objekt von der Observable Klasse erstellen welche dann über this.addObserver(new win()); die JFrame Klasse als Observer added.
[Java]
public class ObsBox extends Observable {

public ObsBox(){
this.addObserver(new win());
}

public synchronized void setChanged() {
super.setChanged();
}

public void notifyObserver(){
super.notify();
}

public static void main(String[] args){
new ObsBox();
}
}
[/code]
Da komm ich dann aber mit der ImageComponent-Methode nicht klar, weil dort ja auch ein "neues" Objekt von der Observable Klasse erstellt werden muss?
Java:
public class ImageComponent extends JComponent{   
	private BufferedImage image;
	ObsBox notifier = new ObsBox();
	
	public void setImage( BufferedImage image ) {     
		this.image = image;  
		setPreferredSize( new Dimension(image.getWidth(), image.getHeight()));
		notifier.setChanged();
		notifier.notifyObserver();
	}   
	
	protected void paintComponent( Graphics g ){
		
		if ( image != null )
			g.drawImage( image,
					((getWidth()/2) - (image.getWidth()/2)),
					((getHeight()/2) - (image.getHeight()/2)),
					this); 			
	} 
}

Die andere Möglichkeit wäre über die Main als erstes das JFrame Objekt zu erstellen und dann eben wie weiter oben die Observable zu erstellen. Dann check ich aber nicht wie ich das JFrame Window als Observer adden kann, weil da ja kein Observable Objekt existiert? Ich hoffe mein Verständnisproblem wird etwas klar.
Danke für die Hilfe
geneticZ
 
Zuletzt bearbeitet:
G

Gast2

Gast
Klasse Frame nur die wichtigsten Sachen

Java:
public class ObserverTest extends JFrame implements Observer{
		
		private MyPanel myPanel;
	
	
		public ObserverTest() {
			myPanel = new myPanel();
			myPanel.addObserver(this);
		}

		@Override
		public void update(Observable arg0, Object arg1) {
			// TODO Auto-generated method stub

		}

}

Panel Klasse
Java:
public class ObsPane extends JPanel{
private Observable notifier = new Observable ();
 
public void setImage(Image image){
 this.image = image;
 notifier .setChanged();
 notifier.notify();
 }

public void addObserver(Observer obs){
notifier.addObserver();
}
}
 
Zuletzt bearbeitet von einem Moderator:

geneticZ

Bekanntes Mitglied
ah! Es scheint zu funktionieren! Danke! :)
Die Scrollpane wird leider trotzdem noch nicht aufgerufen, bzw weiterhin erst nach klick auf Frame.
Hier mein Frame Code:
[Java]
import java.awt.Dimension;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.util.Observable;
import java.util.Observer;

import javax.swing.*;

public class win extends JFrame implements Observer{
JMenuBar menuBar;
JMenu menu;
JMenuItem menuItem;
JPanel contentPane;

ObsBox obs;
Command openImage;

public win(){
setTitle("ImageViewer");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500, 300);


contentPane = (JPanel) getContentPane();
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));

ImageComponent im = new ImageComponent();
im.addObserver(this);

Command openImage = new OpenImageCmd(im);
JScrollPane pane = new JScrollPane(im);

menuBar = new JMenuBar();

menu = new JMenu("File");
menuBar.add(menu);

menuItem = new OpenImage(openImage);
menu.add(menuItem);

setJMenuBar(menuBar);

contentPane.add(pane);

setVisible(true);
}

public void update(Observable o, Object arg) {
repaint();
}
}
[/code]
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Hilfe bei dem Erstellen einer SQL Abfrage aus gewählten JComboBoxen AWT, Swing, JavaFX & SWT 5
JavaBeginner22 Button Hilfe AWT, Swing, JavaFX & SWT 0
ExceptionOfExpectation Textdarstellung auf einem Canvas mit Hilfe von repaint(); AWT, Swing, JavaFX & SWT 6
senol JOptionPane hilfe!!! :(((( AWT, Swing, JavaFX & SWT 32
donnico2 Objekte in der GUI ausgeben mit Hilfe einer DAO AWT, Swing, JavaFX & SWT 1
J Swing Hilfe bei Layout AWT, Swing, JavaFX & SWT 2
Zrebna JavaFX-Projekt mit Bildern funktioniert nicht - um Hilfe wird gebeten AWT, Swing, JavaFX & SWT 14
F BorderLayout Hilfe bei Anzeige AWT, Swing, JavaFX & SWT 2
J Hilfe beim tablevies AWT, Swing, JavaFX & SWT 2
T Swing Hilfe - Selbst Informatik Lehrer konnte mir nicht weiter Helfen AWT, Swing, JavaFX & SWT 2
W Swing Hilfe beim Einbinden von Bildern in einem JFrame AWT, Swing, JavaFX & SWT 8
A Swing TicTacToe-Bitte um Hilfe AWT, Swing, JavaFX & SWT 32
T Bitte um Hilfe AWT, Swing, JavaFX & SWT 2
T Hilfe bei Code AWT, Swing, JavaFX & SWT 2
S Hilfe bei Java Gui Anfänger AWT, Swing, JavaFX & SWT 5
J Warum geht das nicht? if-else usw..... compilieren geht nicht -- HILFE!!! AWT, Swing, JavaFX & SWT 10
M Problem mit Layoutmanagern... Hilfe wäre sehr nett. AWT, Swing, JavaFX & SWT 2
T Hilfe was mus ich tun um das fertige JfxFenster zu sehen AWT, Swing, JavaFX & SWT 2
R Hilfe beim ändern des Hintergrundes eines JFrames AWT, Swing, JavaFX & SWT 9
A hilfe für flowlayout AWT, Swing, JavaFX & SWT 6
N Swing Benötige Hilfe um ein Swing Canvas zu speichern AWT, Swing, JavaFX & SWT 4
X Swing JButton's zum JScrollPane hinzufügen geht nicht. Bitte um Hilfe. AWT, Swing, JavaFX & SWT 9
C Gesucht: Hilfe beim programmieren. AWT, Swing, JavaFX & SWT 1
V Swing Brauche Hilfe mit Label AWT, Swing, JavaFX & SWT 3
C Hilfe beim programmieren mit studiumgebundenes Projekt AWT, Swing, JavaFX & SWT 1
T Swing JTable Zeile mit ausgelesenen Werten mit Hilfe von einem Button hinzufügen AWT, Swing, JavaFX & SWT 1
A JavaFX Hilfe beim Design eines Quiz AWT, Swing, JavaFX & SWT 2
H Swing Hilfe bei GUI AWT, Swing, JavaFX & SWT 4
T HILFE wie lösche ich gezeichnetes per tastendruck AWT, Swing, JavaFX & SWT 1
R Swing JOptionPane Fehlermeldung- bitte um Hilfe! AWT, Swing, JavaFX & SWT 4
Tausendsassa ImageIcon?! Hilfe! AWT, Swing, JavaFX & SWT 10
C Hilfe bei JSpinner und JList AWT, Swing, JavaFX & SWT 1
J GridBagLayout mit Hilfe einer For-Schleife befüllen AWT, Swing, JavaFX & SWT 1
M Hilfe bei Performanceverbesserung AWT, Swing, JavaFX & SWT 34
B Hilfe welches Layout brauch ich AWT, Swing, JavaFX & SWT 4
M SwingWorker Hilfe! AWT, Swing, JavaFX & SWT 10
K Swing Brauche Hilfe AWT, Swing, JavaFX & SWT 6
O AWT Performance und Bug behebung[brauche Hilfe] AWT, Swing, JavaFX & SWT 2
K Swing Konsolen Programm in GUI - Suche Hilfe bei Konsolenausgabe AWT, Swing, JavaFX & SWT 2
K Viele Textfield mit Hilfe eines MousListener leeren - möglich? AWT, Swing, JavaFX & SWT 8
I ausgewählte Zeile mit Hilfe der Tastatur löschen! AWT, Swing, JavaFX & SWT 3
Kenan89 Java FX GUI Hilfe für erste Java FX App AWT, Swing, JavaFX & SWT 8
B Rechteck Mit Hilfe Von Timeline, KeyFrames animieren AWT, Swing, JavaFX & SWT 3
J LayoutManager Hilfe bei Wahl des Layouts AWT, Swing, JavaFX & SWT 9
F Hilfe beim ausschalten von Robot AWT, Swing, JavaFX & SWT 7
N Hilfe bei Memory-Spiel AWT, Swing, JavaFX & SWT 18
L Swing Hilfe bei JTabelModel gesucht AWT, Swing, JavaFX & SWT 4
B Hilfe zu JTable und JTabbedPane AWT, Swing, JavaFX & SWT 18
K Hilfe bei Labels AWT, Swing, JavaFX & SWT 3
S Hilfe beim Lernprozess von java3d AWT, Swing, JavaFX & SWT 20
T JLayeredPanel - Hilfe AWT, Swing, JavaFX & SWT 7
C Swing Hilfe bei umsetzung eines Stundenplans. AWT, Swing, JavaFX & SWT 7
K Swing Hilfe beim JTree! AWT, Swing, JavaFX & SWT 3
N Hilfe bei Panels! AWT, Swing, JavaFX & SWT 11
F Swing Syntaxhighlighting Hilfe AWT, Swing, JavaFX & SWT 5
Jats Bitte um Hilfe bei JComboBox mit Array AWT, Swing, JavaFX & SWT 6
Jats Hilfe bei FocusListener für Taschenrechner AWT, Swing, JavaFX & SWT 4
N Swing nach Fensterrand Action ausführen? HILFE AWT, Swing, JavaFX & SWT 7
R Hilfe bei Bachelorrabeit. Seitenvorschau AWT, Swing, JavaFX & SWT 7
L Mein Kopf dreht sich... Brauche Hilfe beim GUI gestalten AWT, Swing, JavaFX & SWT 10
G Swing Hilfe-Fenster erstellen AWT, Swing, JavaFX & SWT 20
E LayoutManager Hilfe ein GridbagLayout!! AWT, Swing, JavaFX & SWT 7
K GUI-Hilfe für Anfänger AWT, Swing, JavaFX & SWT 15
J Schulprojekt und braucht hilfe AWT, Swing, JavaFX & SWT 54
radiac Hilfe bei GUI AWT, Swing, JavaFX & SWT 22
N Hilfe bei erstellen eines Bibliotheksprogrammes AWT, Swing, JavaFX & SWT 15
H Swing Jtable wird nicht angezeigt..hilfe!! AWT, Swing, JavaFX & SWT 16
M DRINGEND HILFE TextPane RECHTSBÜNDIG AWT, Swing, JavaFX & SWT 2
B Swing Hilfe zu JTextField AWT, Swing, JavaFX & SWT 2
J Brauche ganz dringend Hilfe!!! AWT, Swing, JavaFX & SWT 5
V Bitte um Hilfe bei nem Taschenrechner AWT, Swing, JavaFX & SWT 8
F NullPointerException - HILFE!! AWT, Swing, JavaFX & SWT 20
G Hilfe!!!Sudoku AWT, Swing, JavaFX & SWT 19
M Swing JButton hilfe AWT, Swing, JavaFX & SWT 3
M brauche Hilfe um Einträge aus Jlist zu löschen AWT, Swing, JavaFX & SWT 4
Spin Hilfe - Erklärungsbedarf für Kreis AWT, Swing, JavaFX & SWT 5
O Bitte um Hilfe bei ComboBox in TableHeader AWT, Swing, JavaFX & SWT 9
M Erstellen eines Hilfe-Fenster bzw"Erste-Schritte" AWT, Swing, JavaFX & SWT 2
G Hilfe beim Erstellen eines eigenen Html-Editors! AWT, Swing, JavaFX & SWT 4
G Hilfe Meine JPanels verschwinden im Müll AWT, Swing, JavaFX & SWT 10
G Hilfe AWT, Swing, JavaFX & SWT 8
N ausrichtung Button - hilfe bitte AWT, Swing, JavaFX & SWT 2
T Hilfe zu Events? AWT, Swing, JavaFX & SWT 6
A Ini Datei Auswerten - HILFE! AWT, Swing, JavaFX & SWT 6
D Hilfe bei GUI-Elementen in Java AWT, Swing, JavaFX & SWT 9
D Grafikeinsteiger sucht/braucht Hilfe. Wäre Nett ! AWT, Swing, JavaFX & SWT 3
K Mein Informatikprojekt läuft aus dem Ruder Hilfe. F1 ^^ AWT, Swing, JavaFX & SWT 5
S Hilfe! Bekomme Daten nicht ausgelesen AWT, Swing, JavaFX & SWT 3
M hilfe! probleme mit meinem programm AWT, Swing, JavaFX & SWT 5
V Hilfe :( bekomme textarea nicht versetzt AWT, Swing, JavaFX & SWT 2
M Hilfe ich komme nicht an ein JTextArea AWT, Swing, JavaFX & SWT 4
J Hilfe CardLayout AWT, Swing, JavaFX & SWT 3
C Hilfe bei JInternalFrame AWT, Swing, JavaFX & SWT 6
G BubbleSort mit Hilfe einer Balkengrafik visualisieren AWT, Swing, JavaFX & SWT 9
G Leider trotz allem kein Icon :( Brauche Hilfe AWT, Swing, JavaFX & SWT 3
S sinuskurve hilfe! AWT, Swing, JavaFX & SWT 2
D JSplittPane - unsichtbarer Rahmen? hilfe ;) AWT, Swing, JavaFX & SWT 2
G Selbstprogrammierter Editor - brauche Hilfe AWT, Swing, JavaFX & SWT 5
J Hilfe bei EventListening AWT, Swing, JavaFX & SWT 3
M Hilfe bei vers. Fonts und Zeilenlänge in eigenem Editor. AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben