Code Architektur verbessern.

Status
Nicht offen für weitere Antworten.

boarter

Mitglied
hallo: ich wollte mal fragen ob ihr euch meinen code ansehen könntet. habe hier einen psd-viewer gebastelt und bin mit der architektur nicht zufrieden. ich lade ein Image mit Jimi und dem SwingWorker ( LoadImage Klasse).
wenn der fertig ist übergibt der die instanz von der PsdViewer Klasse an die CreateBufferedImage Klasse (arbeitet auch mit SwingWorker) weiter, welche das Image in ein BufferdImage konvertiert (brauche ein bufferedImage um später mit den einzelnen pixel arbeiten zu können). und letztendlich ruft diese klasse das repaint vom der PsdViewer Instanz auf. Wäre super, wenn ihr verbesserungsvorschläge bringen könntet. danke, boarter.

Edit: Vorhin hat der code so funktioniert, jetzt wenn ich ihn ausführe, klappt es nur manchmal, das problem liegt in der CreateBufferedImage Klasse. brauche ich dort nochmal einen listener, der nachfragt ob die operation fertig ist oder liegt es an etwas anderem? danke





Code:
package gui;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class PsdViewerMain
{
  public static void main( String[] args ) throws Exception
  {
    JFrame f = new JFrame( "Jimi PSD Viewer" );
    f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    f.setSize( 500, 500 );
  
    final PsdViewer viewer = new PsdViewer();
    f.add( new JScrollPane( viewer ) );
    
    JButton loadBtn = new JButton( "load Image" );
    JButton saveBtn = new JButton( "save Image" );
    
    loadBtn.addActionListener( new ActionListener()
    {
      public void actionPerformed( ActionEvent e )
      {
        viewer.loadImage();
        
      }
    } );
    
    saveBtn.addActionListener( new ActionListener()
    {
      public void actionPerformed( ActionEvent e )
      {
        viewer.saveImage();
        
      }
    } );
    
    JPanel buttonHolder = new JPanel();
    buttonHolder.setLayout( new FlowLayout() );
    buttonHolder.add( loadBtn );
    buttonHolder.add( saveBtn );
    f.add( buttonHolder, BorderLayout.PAGE_END );
    
    f.setVisible( true );
    
  }
}




Code:
package gui;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.swing.*;
import com.sun.jimi.core.*;


class PsdViewer extends JPanel
{
  Image image;
  BufferedImage bufferedImage;
 
  
  public void loadImage()
  {
    new LoadImage( this ).execute();
    
  }
  
  
  public void saveImage()
  {
    JFileChooser fileChooser =  new JFileChooser();
    fileChooser.setDialogTitle( "Save Image" );
    int state = fileChooser.showSaveDialog( null );
    if( state == JFileChooser.APPROVE_OPTION )
    {
      File file = fileChooser.getSelectedFile();
      System.out.println( file.getAbsolutePath() );
      try{ Jimi.putImage( image, file.getAbsolutePath() ); }
      catch( Exception e ){ e.printStackTrace(); };
     
    } 
  }
  
  
  @Override
  protected void paintComponent( Graphics g )
  {
    Graphics2D g2 = (Graphics2D) g;
    
    if( bufferedImage != null )
    {
      g2.drawImage( bufferedImage, null, 0, 0 );
      
    }
  }
}


Code:
package gui;


import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.SwingWorker;
import javax.swing.filechooser.FileFilter;

import com.sun.jimi.core.Jimi;


class LoadImage extends SwingWorker< Image, Object >
{   
  private final PsdViewer viewer;
  
  public LoadImage( PsdViewer viewer )
  {
    this.viewer = viewer;
    
  }
  
  
  @Override
  protected Image doInBackground() throws Exception
  {
    JFileChooser fileChooser =  new JFileChooser();
    fileChooser.setDialogTitle( "Open Image" );    
    fileChooser.setFileFilter( new FileFilter()
    {
      @Override
      public boolean accept( File f )
      {
        return f.isDirectory() || f.getName().toLowerCase().endsWith( ".psd" );
        
      }

      @Override
      public String getDescription()
      {
        return "Photoshop File";
        
      }
    });
    
    int state = fileChooser.showOpenDialog( null );
    
    if( state == JFileChooser.APPROVE_OPTION )
    {
      File file = fileChooser.getSelectedFile();
      System.out.println( file.getAbsolutePath() );
      this.viewer.image = Jimi.getImage( file.getAbsolutePath() );
      
    } 
    
    return this.viewer.image;
          
  }

  
  
  @Override
  protected void done()
  {
    new CreateBufferedImage( this.viewer ).execute();
    
  } 
}


Code:
package gui;


import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.image.BufferedImage;

import javax.swing.SwingWorker;

class CreateBufferedImage extends SwingWorker< Boolean, Object >
{
  PsdViewer viewer;
  BufferedImage bi;
  
  
  public CreateBufferedImage( PsdViewer viewer )
  {
    this.viewer = viewer;
    
  }

  
  @Override
  protected Boolean doInBackground() throws Exception
  {
    GraphicsConfiguration gfxc = GraphicsEnvironment.getLocalGraphicsEnvironment().
    getDefaultScreenDevice().getDefaultConfiguration();

    if( this.viewer.image instanceof BufferedImage ) 
      return false;

    bi = gfxc.createCompatibleImage( this.viewer.image.getWidth( null ), this.viewer.image.getHeight( null ) );
    
    Graphics2D g = bi.createGraphics();
    g.drawImage( this.viewer.image, 0, 0, this.viewer.getParent() );
    g.dispose();

    return true;
         
  }

  
  @Override
  protected void done()
  {
    try
    {
      if( get() )
      {
        this.viewer.bufferedImage = bi;
        this.viewer.repaint();
        
      }   
    }catch( Exception e ){ e.printStackTrace(); };
    
  }
}[quote][/quote]
 

Azrahel

Bekanntes Mitglied
Ein Listener reagiert auf Events, also sowas wie MouseBewegung, Tastendruck, Fensterverschiebung etc.

So spontan hab ich in der CreateBufferedImage aber nix gesehen wo man nen Listener dranhängen müsste... wie wärs denn wenn du mal den Fehler postest :)

Auf den ersten Blick (d.h. drüber geguggt und keine Augenschmerzen bekommen) sieht der Code gut aus (meiner Meinung nach).
Aber wenn du deinen Code verbessert haben willst stells unter Stellenangebote oder setz'n Bier oder so dafür aus *gg* Weil DIR helfen das DU deine Fehler findest ist eine Sache, auch konkrete Fragen zu Verbesserungen an deinem Code, aber wenn sich jemand die Mühe macht deinen kompletten Code zu refactorieren das ist schon Arbeit, und je besser der Code eh schon ist desto mehr Arbeit ist es auch.
 

boarter

Mitglied
hei Azrahel, danke für die antwort. mir geht es nicht darum, dass jemand den code komplett auseinandernimmt, sonder ob vielleicht der eine oder andere einen verbesserungsvorschlag hat, will ja schliesslich was dazulernen :wink:. der fehler hat sich mittlerweile erledigt seit dem ich alles nochmal umgebaut habe bzw. seit ich einen observer / observable benütze.
 

Azrahel

Bekanntes Mitglied
Also ich bin jetzt nur 2mal über deinen Code drüber geflogen, und wie gesagt ich hab nichts dran zu mäkeln, ist schön aufgeteilt, sauber und übersichtlich. Vllt hat jemand anderes noch spezielle Vorschläge, aber da muss ich leider passen
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
comp_math Code snippets AWT, Swing, JavaFX & SWT 3
G JavaFX Code in neues Projekt übernehmen AWT, Swing, JavaFX & SWT 0
princess_sara1997 .jar Datei führt den Code nicht richtig aus AWT, Swing, JavaFX & SWT 19
S Ich bringe Code mit JavaFX unter Apache NetBeans IDE 12.6 nicht zum laufen. AWT, Swing, JavaFX & SWT 14
U Kann man den Code umschreiben? AWT, Swing, JavaFX & SWT 8
U Code doch nicht austauschbar in 2DGraphics AWT, Swing, JavaFX & SWT 2
K Bekomme (u.a) javafx.fxml.LoadException trotz "korrektem" Code AWT, Swing, JavaFX & SWT 8
M JavaFX kann man da noch was am code vereinfachen design technisch sieht nicht richtig aus... AWT, Swing, JavaFX & SWT 15
S ActionEvent Press Enter per Code auslösen AWT, Swing, JavaFX & SWT 22
T FXML Datei in Java Code einbinden: javafx.fxml.LoadException AWT, Swing, JavaFX & SWT 2
CptK Ordentlicher Code & Panel ab bestimmter Komponentenzahl scrollbar machen AWT, Swing, JavaFX & SWT 12
T Anderen Java Code durch Code kompilieren und Fehler in Label ausgeben AWT, Swing, JavaFX & SWT 5
L Verbindung von Code und JFrame AWT, Swing, JavaFX & SWT 4
M Swing Code funktioniert auf Windows aber nicht Linux... AWT, Swing, JavaFX & SWT 3
T JavaFX Falscher Wert getLayoutBounds? + Tipps zum Code-Aufbau? AWT, Swing, JavaFX & SWT 8
S JavaFX JavaScript Code in WebView/WebEngine AWT, Swing, JavaFX & SWT 0
L JavaFX GUI mit JavaFX. Scene Builder source code? AWT, Swing, JavaFX & SWT 6
V JavaFX Button Controller Fehler, trotz Erfolg in einem anderem Code? AWT, Swing, JavaFX & SWT 7
Ernesto95 JavaFX FXML vs. Java Code AWT, Swing, JavaFX & SWT 3
T Hilfe bei Code AWT, Swing, JavaFX & SWT 2
B Wie erstelle ich eine JavaFX Anwendung von diesem Code? AWT, Swing, JavaFX & SWT 3
D JavaFX Beim Schließen (Rotes X) Code ausführen AWT, Swing, JavaFX & SWT 1
D JavaFX Dynamisch erzeugte Buttons sollen Code ausführen. AWT, Swing, JavaFX & SWT 2
T Tab per Code wechseln? AWT, Swing, JavaFX & SWT 3
C Swing GUI extrem langsam - GUI-Code richtig ausführen AWT, Swing, JavaFX & SWT 1
U Bild innerhalb hatml code anzeigen AWT, Swing, JavaFX & SWT 5
N JOGL-Code != C OpenGL-Code? AWT, Swing, JavaFX & SWT 9
R Source-Code, Javadoc AWT, Swing, JavaFX & SWT 16
S NetBeans GUI Builder - Code-Platzierung AWT, Swing, JavaFX & SWT 3
J Sauberer Gui-Code? AWT, Swing, JavaFX & SWT 22
B Color String Code AWT, Swing, JavaFX & SWT 3
D JFreeChart - aktuelle code beispiele AWT, Swing, JavaFX & SWT 11
T Bei Klick Code ausführen AWT, Swing, JavaFX & SWT 17
J JMenuBar ist geaddet, aber nicht im Frame. Wo ist der Fehler? (inkl. Code) AWT, Swing, JavaFX & SWT 2
B Swing Laden von serialisierten Objekten (invalid type code AC)) AWT, Swing, JavaFX & SWT 3
S Swing Scrollpanes: wie kann ich durch Java-Code an den "Anfang" scrollen AWT, Swing, JavaFX & SWT 8
J prinzipielles verständnis für Oberfläche/Code-trennung AWT, Swing, JavaFX & SWT 5
A Applet Applet aus Code neu starten AWT, Swing, JavaFX & SWT 2
C 2D-Grafik BufferedImage laden, Frage zum Code AWT, Swing, JavaFX & SWT 2
M JFileChooser setCurrentDirectory() - Verzeichnis relativ zum Code/binary AWT, Swing, JavaFX & SWT 14
L ListSelectionListener durch Code auslösen AWT, Swing, JavaFX & SWT 3
S 2D-Grafik Warum funktioniert dieser Code ? (GUI) AWT, Swing, JavaFX & SWT 9
M ActionListener mit code!!! auslösen AWT, Swing, JavaFX & SWT 3
hdi SWT Shell: Auslagerung von Code verändert Verhalten AWT, Swing, JavaFX & SWT 6
data89 Code-completion-window erzeugen - wie? AWT, Swing, JavaFX & SWT 2
C JTree per code selektierte Node wird nicht farbig hinterlegt AWT, Swing, JavaFX & SWT 2
K Swing GUI code tutorials? AWT, Swing, JavaFX & SWT 5
P Swing [gelöst/erledigt] Gleicher Code läuft unterschiedlich unter Linux und Windows AWT, Swing, JavaFX & SWT 5
G Code Blöcke AWT, Swing, JavaFX & SWT 6
S swt table mit checkboxen: wie nachträglich im code setzen? AWT, Swing, JavaFX & SWT 6
PAX Iconified JFrame per Code wieder anzeigen lassen (deiconify) AWT, Swing, JavaFX & SWT 2
O Source Code für "javax.swing.JLabel" ? AWT, Swing, JavaFX & SWT 2
T Öffnen von SWT-Dialogboxen durch HTML-Link in HTML-Code AWT, Swing, JavaFX & SWT 4
Z habe code, habe fehler, habe keine lösung AWT, Swing, JavaFX & SWT 7
P HTMLDocument in einem JTextPane. Anhängen von HTML-Code AWT, Swing, JavaFX & SWT 2
R Sun tutorial code von jcombobox mit image im combobox fehlt! AWT, Swing, JavaFX & SWT 3
S Unterschiedliche Optik trotz gleicher Look and Feel Code? AWT, Swing, JavaFX & SWT 11
M Code umbauen ? AWT, Swing, JavaFX & SWT 7
C GUI passt sich nicht dem Code an! AWT, Swing, JavaFX & SWT 4
7 Latex/MathML Code in JTextPane AWT, Swing, JavaFX & SWT 2
R Syntax Highlighting von Java-Code AWT, Swing, JavaFX & SWT 2
O Swing Event / in GUI oder im Code ausgelöst ? AWT, Swing, JavaFX & SWT 2
J eventhandling / Problemmeldung Bitte schaut euch den Code an AWT, Swing, JavaFX & SWT 2
M Code Schloss AWT, Swing, JavaFX & SWT 11
C wysiwyg Editor zum Einbinden in meinem Code AWT, Swing, JavaFX & SWT 14
m@nu JComboBox & ItemListener: per Code 1. Item wählen AWT, Swing, JavaFX & SWT 2
M Mit JTextPane erstelltes Dokument als HTML-Code ausgeben AWT, Swing, JavaFX & SWT 4
H Code nach dem schließen eines Fensters ausführen? AWT, Swing, JavaFX & SWT 3
M Was halter iht von diesem Code? AWT, Swing, JavaFX & SWT 7
L MVC-Architektur AWT, Swing, JavaFX & SWT 16
B Swing MVC Architektur Umsetzung AWT, Swing, JavaFX & SWT 9
S allg. Frage zur GUI-Architektur AWT, Swing, JavaFX & SWT 5
W 3 Schichten Architektur AWT, Swing, JavaFX & SWT 8
P richtige "Architektur" mit GUIs AWT, Swing, JavaFX & SWT 2
B Was würden Profis an meiner Klasse verbessern? AWT, Swing, JavaFX & SWT 1
W Swing Performance bei Griderstellung verbessern AWT, Swing, JavaFX & SWT 15
S Bildqualität verbessern AWT, Swing, JavaFX & SWT 3
F Wie Oberfläche verbessern? (JButtons, Textfeld verkleinern) AWT, Swing, JavaFX & SWT 5
I Windows LaF verbessern? AWT, Swing, JavaFX & SWT 12
W Performance verbessern AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben