двойной щелчок на изображении в jtable приводит к исчезновению imageIcon - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть JTable, где я получаю данные из БД и отображаю. Один из столбцов имеет тип blob oject и содержит изображение (если есть, иначе ноль). У меня также есть обработчик событий двойного щелчка для JTable, так что, когда пользователь дважды щелкает только на изображении, открывается новый JFrame, который показывает изображение в полноэкранном режиме. Проблема, с которой я сталкиваюсь, состоит в том, что, когда пользователь дважды щелкает изображение, оно отображается в новом окне, как и ожидалось, однако imageIcon, который был ранее видим в JTable, исчезает, и вместо этого отображается строка, имеющая значение javax.swing.ImageIcon@1ce5bc4d. Так как же вернуть imageIcon после завершения события двойного щелчка? Вот мой код (столбец payment_receipt - это блоб):

String query = "Select payment_date,payment_amt,payment_receipt from fooTable";
    conn = dbTest.connect();
    try {
        PreparedStatement ps = conn.prepareStatement(query);
        ResultSet rs = ps.executeQuery();
        ResultSetMetaData rsMetaData = (ResultSetMetaData) rs.getMetaData();
        int columns = rsMetaData.getColumnCount();

        //names of columns
        Vector<String>columnNames = new Vector<String>();

        for(int i=1;i<=columns;i++)
        {
            columnNames.add(rsMetaData.getColumnName(i));
        }

        //data of table
         Vector<Vector<Object>> data = new Vector<Vector<Object>>();
         while (rs.next()) {
                Vector<Object> vector = new Vector<Object>();
                for (int columnIndex = 1; columnIndex <= columns; columnIndex++) 
                {
                    if (columnIndex ==3 ) //starting index is 1
                    {  // image column
                        Blob blob = rs.getBlob("payment_receipt");
                        if(blob!=null)
                        {

                            int blobLength = (int) blob.length();  

                            byte[] bytes = blob.getBytes(1, blobLength);
                            blob.free();
                            BufferedImage img=null;
                            try {
                                img = ImageIO.read(new ByteArrayInputStream(bytes));
                                icon = new ImageIcon(img);

                                vector.addElement(icon);
                            } 
                            catch (Exception e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }

                        }
                    } 
                    else 
                    {
                        vector.addElement(rs.getObject(columnIndex));
                    }

            }
           data.add(vector);
         }
         table = new JTable(new DefaultTableModel(data,columnNames))
                 {
                    @Override
                    public Class<?> getColumnClass(int column) {
                        if(column==2)
                        {
                                return ImageIcon.class;
                        }
                        else
                            return Object.class;
                    }
                };

        table.setRowHeight(200);//to display the receipt
        table.setPreferredScrollableViewportSize(this.getPreferredSize());
        table.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent mouseEvent)
            {
                JTable table = (JTable)mouseEvent.getSource();
                Point point = mouseEvent.getPoint();
                int row = table.rowAtPoint(point);//the index of row where the double click event too place
                int column = table.columnAtPoint(point);
                if(mouseEvent.getClickCount()==2 && table.getSelectedRow() !=-1)
                {
                    if(column==2)//image column,so open image in full screen
                    {
                        Object obj = table.getValueAt(row, column);
                        if(obj!=null)
                        {
                            if(obj.getClass().equals(ImageIcon.class))
                            {
                                ImageIcon icon = (ImageIcon)obj;
                                jf = new JFrame();
                                jf.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
                                jf.setBounds(GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds());
                                jf.add(new JLabel(icon));
                                jf.setVisible(true);
                                loadPaymentsTable();
                            }
                            else
                            {
                                JOptionPane.showMessageDialog(null, "No image available");
                                loadPaymentsTable();
                            }
                        }
                        else
                        {
                                JOptionPane.showMessageDialog(null, "No image available");
                                loadPaymentsTable();
                        }
                    }
                }
            }

        });
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Я получил решение, изменив ImageIcon.class на Icon.class здесь:

@Override
                public Class<?> getColumnClass(int column) {
                    if(column==2)
                    {
                            return Icon.class;
                    }
                    else
                        return Object.class;
                }
0 голосов
/ 09 апреля 2020

Возможно использование одной и той же ImageIcon в двух JFrame с вызывает проблему; сделайте копию изображения для нового окна.

Собственные ресурсы, используемые java компонентами, особенно изображениями и BufferedImages, чувствительны к повторному использованию и утилизации.

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