Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отображение картинок в jtableиз mysql? в jtable в место картинки [B@125fefa 
:(
    Опции темы
kresh
Дата 10.4.2009, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 1.1.2008
Где: Минск

Репутация: нет
Всего: нет



Всем привет! Вопрос в следующем в mysql есть данные которым соотвествуют изображения. Тип столбца в mysql MediumBlob-тут все ок. 
Проблемы начинаются при отражении инфы из БД в jtable- вместо картинки отображается-[B@125fefa. Для извлечения данных и помещения их в таблицу на форме, использую 
Код

/**
 * This model work with any database table. You should only set an object of java.sql.ResultSet into it.
 * This table cannot insert data into database.
 */

import java.util.*;
import java.sql.*;
import java.awt.*;
import javax.swing.table.*;
import javax.swing.*;

public class DatabaseTableModel extends AbstractTableModel {
    private static final long serialVersionUID = 1L;
    private ArrayList<String> columnNames = new ArrayList<String>();
    private ArrayList<Class> columnTypes = new ArrayList<Class>();
    private ArrayList data = new ArrayList();

    public int getRowCount() {
        synchronized (data) {
            return data.size();
        }
    }

    public int getColumnCount() {
        return columnNames.size();
    }

    public Object getValueAt(int row, int col) {
        synchronized (data) {
            return ((ArrayList) data.get(row)).get(col);
        }
    }

    public String getColumnName(int col) {
        return columnNames.get(col);
    }

    public Class getColumnClass(int col) {
        return columnTypes.get(col);
    }

    public boolean isEditable() {
        return true;
    }

    public void setValueAt(Object obj, int row, int col) {
        synchronized (data) {
            ((ArrayList) data.get(row)).set(col, obj);
        }
    }

    /**
     * Core of the model. Initializes column names, types, data from ResultSet.
     *
     * @param rs ResultSet from which all information for model is token.
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    public void setDataSource(ResultSet rs) throws SQLException, ClassNotFoundException {
        ResultSetMetaData rsmd = rs.getMetaData();
        columnNames.clear();
        columnTypes.clear();
        data.clear();

        int columnCount = rsmd.getColumnCount();
        for (int i = 0; i < columnCount; i++) {
            columnNames.add(rsmd.getColumnName(i + 1));
            Class type = Class.forName(rsmd.getColumnClassName(i + 1));
            columnTypes.add(type);
        }
        fireTableStructureChanged();
        while (rs.next()) {
            ArrayList rowData = new ArrayList();
            for (int i = 0; i < columnCount; i++) {
                if (columnTypes.get(i) == String.class)
                    rowData.add(rs.getString(i + 1));
                else
                    rowData.add(rs.getObject(i + 1));
            }
            synchronized (data) {
                data.add(rowData);
                this.fireTableRowsInserted(data.size() - 1, data.size() - 1);
            }
        }
    }

    //***TEST***
    public static void main(String[] args) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url = "database_url";                //your data
            String user = "user_name";                  //your data
            String password = "password";               //your data
            String query = "select * from table_name";  //your data
            Connection con = DriverManager.getConnection("jdbc:mysql://" + url, user, password);
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(query);
            DatabaseTableModel model = new DatabaseTableModel();
            model.setDataSource(rs);
            JTable table = new JTable(model);

            JPanel panel = new JPanel(new BorderLayout());
            panel.add(new JScrollPane(table), BorderLayout.CENTER);

            JFrame frame = new JFrame("Database Table Model");
            frame.setLocationRelativeTo(null);
            frame.setSize(500, 400);
            frame.setContentPane(panel);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);

        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

Все остальные данные из бд mysql  отображаются нрм.
Помогите разобраться с вопросом  Заранее всех благодарю!
--------------------
Спросит вас продавец в магазине формулу Гаусса-Остроградского... А вы ее не знаете!
PM MAIL   Вверх
Connie
Дата 11.4.2009, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 12.8.2008

Репутация: 8
Всего: 9



Куски менеджера
Код

public BufferedImage getPict(int id){
        BufferedImage image = null;
        try{
            PreparedStatement stmt = manager.getConnection().prepareStatement(
                    "SELECT pict FROM plates WHERE idPlate=?;"
                    );
            stmt.setInt(1, id);

            ResultSet rs = stmt.executeQuery();
            if (rs.next()){
                byte[] b = rs.getBytes("pict");
                if (b!=null){
                    try{
                        ByteArrayInputStream bais = new ByteArrayInputStream(b);
                        image = ImageIO.read(bais);
                        bais.close();
                    }catch(Exception e){}
                }
                
            }
            rs.close();
            stmt.close();

            manager.getConnection().commit();
        }
         catch (SQLException e) {
            e.printStackTrace();
        }
        return image;
    }
public void setPict(int id,BufferedImage image){
          if(image != null) {
            try{
              ByteArrayOutputStream baos = new ByteArrayOutputStream(50000);//Max размер рисунка, мне хватает
              ImageIO.write(image, "jpg", baos);
              byte[] buffer = baos.toByteArray();
              baos.close();

              ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
                try{
                    PreparedStatement stmt = manager.getConnection().prepareStatement(
                        "UPDATE plates SET pict=? WHERE idPlate=?;"
                        );

                    stmt.setBytes(1, buffer);
                    stmt.setInt(2, id);
                    stmt.executeUpdate();
                    stmt.close();

                    manager.getConnection().commit();
                }catch(Exception e){
                    e.printStackTrace();
                }

              bais.close();
            }catch(Exception e){
                e.printStackTrace();
            }
          }else{
              try{
                   PreparedStatement stmt = manager.getConnection().prepareStatement(
                        "UPDATE plates SET pict=? WHERE idPlate=?;"
                        );

                    stmt.setBytes(1, null);

                    stmt.setInt(2, id);
                    stmt.executeUpdate();
                    stmt.close();

                    manager.getConnection().commit();
                }catch(Exception e){
                    e.printStackTrace();
                }
          }

          
    }


Это сообщение отредактировал(а) Connie - 11.4.2009, 10:45
PM MAIL WWW   Вверх
Zurtax
Дата 15.4.2009, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 13.10.2006

Репутация: нет
Всего: нет



мне так кажется, что DefaultCellRenderer не умеет рисовать Image
попробуй реализовать свой рендерер, например JLabel, имхо, вполне подойдет
PM MAIL   Вверх
kresh
Дата 15.4.2009, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 1.1.2008
Где: Минск

Репутация: нет
Всего: нет



спасибо  smile 

Это сообщение отредактировал(а) kresh - 15.4.2009, 21:39
--------------------
Спросит вас продавец в магазине формулу Гаусса-Остроградского... А вы ее не знаете!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0776 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.