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
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);
}
}