Jimi (Java): Noclassdeffound исключение на Jimi.createJimiWriter - PullRequest
0 голосов
/ 29 октября 2011

Я не решался спросить это, но я потратил много часов, возиться с переменными окружения, я просто не могу понять это:

Я пытаюсь сохранить все, что отображается в апплете, в файл изображения, после того, какя решил, что JIMI - моя лучшая ставка (ниже не моя оригинальная работа, а простой пример из http://www.coderanch.com/t/337338/GUI/java/save-applet-image-gif-jpeg относительно того, что я буду делать)

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Panel;
import java.awt.Point;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.image.ColorModel;
import java.awt.image.PixelGrabber;
import java.io.OutputStream;
import java.util.Vector;

import com.sun.jimi.core.Jimi;
import com.sun.jimi.core.JimiWriter;

public class JimiApplet extends Applet implements ActionListener {

    private ImageCanvas canvas;
    private TextField filename;
    private Button save, clear;

    public void init() {
        setLayout( new BorderLayout() );
        canvas = new ImageCanvas();
        add( canvas, BorderLayout.CENTER );
        Panel p = new Panel();
        filename = new TextField();
        save = new Button( "Save" );
        save.addActionListener( this );
        clear = new Button( "Clear" );
        clear.addActionListener( this );
        p.setLayout( new GridBagLayout() );
        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = .70;
        p.add( filename, c );
        c.weightx = .15;
        p.add( save, c );
        c.weightx = .15;
        p.add( clear, c );
        add( p, BorderLayout.SOUTH );
    }

    public void actionPerformed(ActionEvent e) { 
        if ( e.getSource() == save ) {
            save.setEnabled( false );
            filename.setEnabled( false );
            filename.setEditable( false );
            Thread t = new Thread( new SaveButtonPressed() );
            t.start();
        } else if ( e.getSource() == clear ) {
            canvas.clear();
        }
    }

    private static class ImageCanvas extends Canvas implements MouseMotionListener {
        private Vector points;

        public ImageCanvas() {
            points = new Vector();
            addMouseMotionListener( this );
        }

        public void mouseDragged(MouseEvent e) {
            Point p = e.getPoint();
            points.add( p );
            repaint();
        }

        public void mouseMoved(MouseEvent e) {
        }

        public void clear() {
            points.removeAllElements();
            repaint();
        }

        public void paint( Graphics g ) {
            int size = points.size();
            g.setColor( Color.black );
            if ( size > 0 ) {
                Point p1 = (Point)points.get( 0 );
                for ( int i = 0; i < size; i++ ) {
                    Point p2 = (Point)points.get( i );
                    g.drawLine( p1.x, p1.y, p2.x, p2.y );
                    p1 = p2;
                }
            }
        }
    }

    private class SaveButtonPressed implements Runnable {
        public void run() {
            Thread t = new Thread( new SaveRunnable() );
            t.start();
            try {
                t.join();
            } catch( InterruptedException x ) { 
                x.printStackTrace();
            }
            finally {
                save.setEnabled( true );
                filename.setEnabled( true );
                filename.setEditable( true );
            }
        }

    }

    private class SaveRunnable implements Runnable {
        public void run() {
            int width = canvas.getSize().width;
            int height = canvas.getSize().height;
            ColorModel cm = canvas.getColorModel();
            int[] pixels = new int[ width * height ];
            Image image = canvas.createImage( width, height );
            Graphics g = image.getGraphics();
            canvas.paint( g );
            PixelGrabber pg = new PixelGrabber( image, 0, 0, width, height, pixels, 0, width );
            boolean success = false;
            try {
                success = pg.grabPixels();
            }
            catch (InterruptedException e2) {
                e2.printStackTrace();
                return;
            }
            if ( success ) {
                String mimeType = "invalid";
                String extension = filename.getText();
                int index = extension.indexOf( '.' );
                extension = extension.substring( index +1);
                System.out.println(extension);
                if ( extension.equalsIgnoreCase( "GIF" ) ) {
                    mimeType = "/image/gif";
                } else if ( extension.equalsIgnoreCase( "JPG" )  ||
                        extension.equalsIgnoreCase( "JPEG" ) ) {
                    mimeType = "image/jpeg";
                } else if ( extension.equalsIgnoreCase( "PNG" ) ) {
                    mimeType = "image/png";
                }

                // You can add more options here for the different image types 
                // you want to support.

                if ( mimeType.equals( "invalid" ) ) {
                    System.err.println( "Could not get a valid mime type from file extension!" );
                    return;
                } else {
                    try {
                        OutputStream imageOutput = null;

                        // Do something here to get an OutputStream pointing to the socket, 
                        // URL of servlet, etc. that you are going to write your image to.
                        System.out.println("got here " + mimeType);
                        JimiWriter writer = Jimi.createJimiWriter( mimeType );
                        System.out.println("probably not here");
                        writer.setSource( image );
                        writer.putImage( imageOutput );
                    } catch ( Exception x ) {
                        x.printStackTrace();
                        return;
                    }
                }
            } else {
                System.err.println( "PixelGrabber failed!" );
            }
        }

    }
}

Я могу скомпилировать этот кодс JIMI в моих переменных среды.Однако при попытке сохранить изображение я получаю сообщение об ошибке:

 Exception in thread "Thread-5" java.lang.NoClassDefFoundError: com/sun/jimi/core/Jimi
           at JimiApplet$SaveRunnable.run(JimiApplet.java:165)
           at java.lang.Thread.run(Thread.java:662)
 Caused by: java.lang.ClassNotFoundException: com.sun.jimi.core.Jimi
            at sun.applet.AppletClassLoader.findClass(AppletClassLoader.java:211)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
            at sun.applet.AppletClassLoader.loadClass(AppletClassLoader.java:144)
            at java.land.ClassLoader.loadClass(ClassLoader.java:247)
            ... 2 more

После исследования я обнаружил, что это в основном связано с отсутствием jimiproclasses в моих переменных окружения, поэтому я попытался добавить их, используя многочисленные комбинацииМне понадобилось полтора часа, чтобы сделать все комбинации, которые, как я думал, будут работать. В CLASSPATH И в PATH я попробовал несколько вещей:

    C:\Users\dfreelan\Dropbox\colormap\Jimi;
    C:\Users\dfreelan\Dropbox\colormap\Jimi\JimiProClasses.zip;
    C:\Users\dfreelan\Dropbox\colormap\Jimi;C:\Users\dfreelan\Dropbox\colormap\Jimi\JimiProClasses.zip;
    C:\Users\dfreelan\Dropbox\colormap\Jimi\src\classes

Я пробовал больше комбинаций, но я верю, что вы можетеполучить суть здесь С каждым из приведенных выше примеров я могу скомпилировать (что показывает, что работает какая-то форма Jimi), я просто не могу выполнить Jimi.createJimiWriter без получения ошибки во время выполнения

Чья-либо помощь очень ценится.Прошу прощения, если это кажется глупым вопросом, но я так долго над ним работал, и я так тщательно его атаковал, что мне показалось, что мне негде повернуться!

1 Ответ

0 голосов
/ 29 октября 2011

Апплеты не получают свой путь к классу из переменной среды CLASSPATH. См. этот вопрос для получения информации о том, как установить classpath для апплета.

...