Использование Eclipse SWT Image, JAVA и SQLite для вставки, хранения и получения изображений - PullRequest
5 голосов
/ 26 октября 2010

Я пишу базовое Java-приложение, которое позволяет пользователю вставлять детали о людях в базу данных SQLite.Я использую Eclipse SWT для графического интерфейса.

Eclipse SWT определяет тип изображения (org.eclipse.swt.graphics.Image) для отображения изображений в графическом интерфейсе.

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

Все довольно просто, но я не могу заставить его работать!Я тоже много искал и не могу найти решение этой проблемы.

Я использую Eclipse IDE для разработчиков Java (3.6), sqlite-jdbc-3.7.2.jar и JDK 1.6.0_22.

import org.eclipse.swt.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.graphics.*;

import java.sql.*;

/***********************************************************************/
/*** Tests reading and writing SWT Images from an SQLite Database    ***/
/***********************************************************************/
public class ImageTest {

    Shell shell;

    //Variables to store the current values when editing
    private Canvas personPhoto;
    private Image personImage;
    private int personID = 1;

    private double photoWidth = 100;
    private double photoHeight = 100;

    //Database connection and statement variables
    private static Connection connection = null;
    private static Statement statement = null;
    private static PreparedStatement ps = null;
    private static ResultSet rs = null;

    public ImageTest(Shell parent, Connection passedConnection) {
        shell = new Shell(parent, SWT.DIALOG_TRIM | SWT.PRIMARY_MODAL);
        shell.setLayout(new GridLayout());
        connection = passedConnection;
    }

    private void createControlButtons() {
        Composite composite = new Composite(shell, SWT.NONE);
        composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        composite.setLayout(layout);

        Button okButton = new Button(composite, SWT.PUSH);
        okButton.setText("OK");
        okButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                if(personID > 0){
                    try {
                        PreparedStatement ps = connection.prepareStatement("UPDATE person SET photo = ? " +
                                                                                              "WHERE person_id = ?");
                        ps.setBytes(1, personImage.getImageData().data);
                        ps.setInt(2, personID);
                        ps.executeUpdate();
                        ps.close();
                    } catch (SQLException err) {
                        err.printStackTrace();
                    }
                } else {
                    try {
                        PreparedStatement ps = connection.prepareStatement("INSERT INTO person (photo) VALUES (?)");
                        ps.setBytes(1, personImage.getImageData().data);
                        ps.executeUpdate();
                        ps.close();
                    } catch (SQLException err) {
                        err.printStackTrace();
                    }
                }               
                shell.close();
            }
        });

        Button cancelButton = new Button(composite, SWT.PUSH);
        cancelButton.setText("Cancel");
        cancelButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                shell.close();
            }
        });

        shell.setDefaultButton(okButton);
    }

    private void createTextWidgets(final Display display) {

        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 2;
        shell.setLayout(gridLayout);
        new Label(shell, SWT.NONE).setText("Photo:");

        personPhoto = new Canvas(shell, SWT.BORDER);
        GridData gridData = new GridData(GridData.FILL, GridData.FILL, true, true);
        gridData.widthHint = (int)photoWidth;
        gridData.heightHint = (int)photoHeight;
        gridData.verticalSpan = 5;
        gridData.horizontalSpan = 2;
        personPhoto.setLayoutData(gridData);
        personPhoto.redraw();

        personPhoto.addPaintListener(new PaintListener() {
            public void paintControl(final PaintEvent event) {
                if (personImage != null) {
                    event.gc.drawImage(personImage, 0, 0);
                }
            }
        });

        //Skip a Column
        new Label(shell, SWT.NONE);

        Button browse = new Button(shell, SWT.PUSH);
        browse.setText("Browse...");
        gridData = new GridData(GridData.FILL, GridData.CENTER, true, false);
        gridData.horizontalIndent = 5;
        browse.setLayoutData(gridData);
        browse.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent event) {
                String fileName = new FileDialog(shell).open();
                if (fileName != null) {
                    personImage = new Image(display, fileName);
                    personPhoto.redraw();
                }
            }
        });

        Button delete = new Button(shell, SWT.PUSH);
        delete.setText("Delete");
        gridData = new GridData(GridData.FILL, GridData.BEGINNING, true, false);
        gridData.horizontalIndent = 5;
        delete.setLayoutData(gridData);
        delete.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent event) {
                if (personImage != null) {
                    personImage.dispose();
                    personImage = null;
                    personPhoto.redraw();
                }
            }
        });

        //Skip a Column
        new Label(shell, SWT.NONE);

        //Skip two Rows
        new Label(shell, SWT.NONE);
        new Label(shell, SWT.NONE);
        new Label(shell, SWT.NONE);
        new Label(shell, SWT.NONE);     
    }

    public void open() {
        Display display = shell.getDisplay();
        //To avoid null pointer exceptions
        personImage = new Image(display,"user.png");

        try{
            PreparedStatement ps = connection.prepareStatement("SELECT photo FROM person WHERE person_id = ?");
            ps.setInt(1, personID);
            rs = ps.executeQuery();
            while (rs.next()) {
                //dispose of the current image
                personImage.dispose();
                personImage = new Image(display, (int) photoWidth, (int) photoHeight);
                //Retrieve the photo for this person
                personImage.getImageData().data = rs.getBytes("photo");
            }
            ps.close();
            rs.close();    
        } catch (SQLException e) {
            e.printStackTrace();
        }

        createTextWidgets(display);
        createControlButtons();
        shell.pack();
        shell.open();
        while(!shell.isDisposed()){
            if(!display.readAndDispatch())
                display.sleep();
        }
    }
}

Сейчас я упростил код, но до сих пор не могу заставить его правильно извлечь массив байтов из базы данных и отобразить его как изображение SWT.У кого-нибудь есть идеи?Любая помощь будет очень признателен!

Шей

    /* Imports */
import org.eclipse.swt.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.graphics.*;

import java.sql.*;

/***********************************************************************/
/*** Tests reading and writing SWT Images from an SQLite Database    ***/
/***********************************************************************/
public class ImageTest {

    Shell shell;

    //Variables to store the current values when editing
    private Canvas personPhoto;
    private Image personImage;
    private int personID = 1;

    private double photoWidth = 100;
    private double photoHeight = 100;

    //Database connection and statement variables
    private static Connection connection = null;
    private static Statement statement = null;
    private static PreparedStatement ps = null;
    private static ResultSet rs = null;

    public ImageTest(Shell parent, Connection passedConnection) {
        shell = new Shell(parent, SWT.DIALOG_TRIM | SWT.PRIMARY_MODAL);
        shell.setLayout(new GridLayout());
        connection = passedConnection;
    }

    private void createControlButtons() {
        Composite composite = new Composite(shell, SWT.NONE);
        composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        composite.setLayout(layout);

        Button okButton = new Button(composite, SWT.PUSH);
        okButton.setText("OK");
        okButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                if(personID > 0){
                    try {
                        PreparedStatement ps = connection.prepareStatement("UPDATE person SET photo = ? " +
                                                                                              "WHERE person_id = ?");
                        ps.setBytes(1, personImage.getImageData().data);
                        ps.setInt(2, personID);
                        ps.executeUpdate();
                        ps.close();
                    } catch (SQLException err) {
                        err.printStackTrace();
                    }
                } else {
                    try {
                        PreparedStatement ps = connection.prepareStatement("INSERT INTO person (photo) VALUES (?)");
                        ps.setBytes(1, personImage.getImageData().data);
                        ps.executeUpdate();
                        ps.close();
                    } catch (SQLException err) {
                        err.printStackTrace();
                    }
                }               
                shell.close();
            }
        });

        Button cancelButton = new Button(composite, SWT.PUSH);
        cancelButton.setText("Cancel");
        cancelButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                shell.close();
            }
        });

        shell.setDefaultButton(okButton);
    }

    private void createTextWidgets(final Display display) {

        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 2;
        shell.setLayout(gridLayout);
        new Label(shell, SWT.NONE).setText("Photo:");

        personPhoto = new Canvas(shell, SWT.BORDER);
        GridData gridData = new GridData(GridData.FILL, GridData.FILL, true, true);
        gridData.widthHint = (int)photoWidth;
        gridData.heightHint = (int)photoHeight;
        gridData.verticalSpan = 5;
        gridData.horizontalSpan = 2;
        personPhoto.setLayoutData(gridData);
        personPhoto.redraw();

        personPhoto.addPaintListener(new PaintListener() {
            public void paintControl(final PaintEvent event) {
                if (personImage != null) {
                    event.gc.drawImage(personImage, 0, 0);
                }
            }
        });

        //Skip a Column
        new Label(shell, SWT.NONE);

        Button browse = new Button(shell, SWT.PUSH);
        browse.setText("Browse...");
        gridData = new GridData(GridData.FILL, GridData.CENTER, true, false);
        gridData.horizontalIndent = 5;
        browse.setLayoutData(gridData);
        browse.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent event) {
                String fileName = new FileDialog(shell).open();
                if (fileName != null) {
                    personImage = new Image(display, fileName);
                    personPhoto.redraw();
                }
            }
        });

        Button delete = new Button(shell, SWT.PUSH);
        delete.setText("Delete");
        gridData = new GridData(GridData.FILL, GridData.BEGINNING, true, false);
        gridData.horizontalIndent = 5;
        delete.setLayoutData(gridData);
        delete.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent event) {
                if (personImage != null) {
                    personImage.dispose();
                    personImage = null;
                    personPhoto.redraw();
                }
            }
        });

        //Skip a Column
        new Label(shell, SWT.NONE);

        //Skip two Rows
        new Label(shell, SWT.NONE);
        new Label(shell, SWT.NONE);
        new Label(shell, SWT.NONE);
        new Label(shell, SWT.NONE);     
    }

    public void open() {
        Display display = shell.getDisplay();
        //To avoid null pointer exceptions
        personImage = new Image(display,"user.png");

        try{
            PreparedStatement ps = connection.prepareStatement("SELECT photo FROM person WHERE person_id = ?");
            ps.setInt(1, personID);
            rs = ps.executeQuery();
            while (rs.next()) {
                //dispose of the current image
                personImage.dispose();
                personImage = new Image(display, (int) photoWidth, (int) photoHeight);
                //Retrieve the photo for this person
                personImage.getImageData().data = rs.getBytes("photo");
            }
            ps.close();
            rs.close();    
        } catch (SQLException e) {
            e.printStackTrace();
        }

        createTextWidgets(display);
        createControlButtons();
        shell.pack();
        shell.open();
        while(!shell.isDisposed()){
            if(!display.readAndDispatch())
                display.sleep();
        }
    }
}

1 Ответ

1 голос
/ 03 августа 2012

Если бы это был я, я бы не сохранил изображение в базе данных. Во-первых, из-за таких проблем, а во-вторых, потому что это сделает базу данных довольно большой. Может быть проще включить путь к изображению в базе данных, а затем загрузить это изображение из пути. Аналогично, при вставке будет вставлен только путь к файлу изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...