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
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]