如何获得的图像数据库,并将其设置为“的ToolTipText()”为表的特定行(How to get

2019-10-28 17:21发布

我创建一个程序,有一个JTable中就可以了,我的数据库”的数据填充。 每一行,上有一个相应的图片,所以我希望发生的是,当我把我的鼠标光标移到该行,它会弹出一个toolTipText,它包含了图片,

 tblListOfInmates = new JTable(){                       
                private static final long serialVersionUID = 8240878564742150750L;
                public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                        Component c = super.prepareRenderer(renderer, row, column);                     
                        if (c instanceof JComponent)  {
                            try{
                                    JComponent jc = (JComponent) c;    

                                    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");                                                                          
                                    con = DriverManager.getConnection("jdbc:odbc:RIM");
                                    st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

                                    String x = tblListOfInmates.getModel().getValueAt(row, 6).toString();
                                    String sql = "select * from records where ID ='"+x+"'";
                                    rs = st.executeQuery(sql);
                                    java.net.URL url = new File(rs.getString("ID")).toURI().toURL();





                                     final String html = "<html><body>" + "<img src='"+ url + "' width=160 height=120> ";

                                    jc.setToolTipText(html + "<br/>"
                                            + getValueAt(row, column).toString()
                                            + ":  row, col (" + row + ", " + column + ")");                                     
                            }catch(Exception e){e.printStackTrace();}
                        }
                        return c;
                    }
            };

我得到这个错误。

 at RecordManagementSystem.MainFrame$18.prepareRenderer(MainFrame.java:860)
at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
at javax.swing.plaf.ComponentUI.update(Unknown Source)
at javax.swing.JComponent.paintComponent(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JViewport.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JLayeredPane.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paintToOffscreen(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
at javax.swing.RepaintManager.paint(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
at java.awt.Container.paint(Unknown Source)
at java.awt.Window.paint(Unknown Source)
at javax.swing.RepaintManager$3.run(Unknown Source)
at javax.swing.RepaintManager$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.access$1100(Unknown Source)
at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

我不知道如何正确地做到这一点,我不知道我的想法是正确的/好。 请告诉我,如果你有更好的想法比这个=)

Answer 1:

我猜你已经尝试在刀尖加载图像是在DB斑点。 这个问题是一个url不能从一个数据库对象进行。 你可以存储在数据库中的文件系统上的网址,但我认为这可能是不可能的,因为你不希望有这两个数据库文件系统映像。

也许你应该做的是,当你加载TableModel ,所有相应的图像,保存到文件系统(暂时)。 你可以做到这一点与File.createTempFile 。 你可以从IMG的URL。

另外请注意,你会想这样做在后台线程。 见并发与Swing

然后,您可以从文件系统,这将是很多比试图从DB一次一个访问更高效的访问这些图像。 然后,您可以使用使用URL从文件系统中的HTML字符串File.getUri().getUrl()

你可以有清除这些图像的文件系统的方法。 该程序关闭时,您可能希望每一套新表的数据加载时调用它,和/或。

您可以从数据库BLOB加载图像并将它写入文件中像这样

Blob blob = rs.getBlob("img");
int blobLength = (int) blob.length();  

byte[] bytes = blob.getBytes(1, blobLength);
blob.free();
BufferedImage img = ImageIO.read(new ByteArrayInputStream(bytes));
ImageIO.write(img, "png", new File("..."));

这里的大多数上述地点的例子。 除了后台线程。 两个懒惰对于这一点,但你想要做的每一个你的更新时间从数据库表格模型

import java.awt.Component;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.net.URL;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class TableToolTip {

    private Map<String, URL> fileMap;

    public TableToolTip() {
        fileMap = new HashMap<>();
        JTable table = createTable();

        JFrame frame = new JFrame();
        frame.add(new JScrollPane(table));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private JTable createTable() {
        JTable table = new JTable(createModel()) {

            public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                Component c = super.prepareRenderer(renderer, row, column);
                if (c instanceof JComponent) {
                    JComponent jc = (JComponent) c;
                    URL url = fileMap.get((String) getValueAt(row, column));
                    String html = "<html><body>"
                            + "<img src='"
                            + url
                            + "' width=150 height=150> ";

                    jc.setToolTipText(html + "<br/>"
                            + getValueAt(row, column).toString()
                            + ":  row, col (" + row + ", " + column + ")"
                            + "</body></html>");
                }
                return c;
            }
        };
        return table;
    }

    private DefaultTableModel createModel() {
        DefaultTableModel model = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost/mario", "root", "password");
            PreparedStatement ps = conn.prepareStatement("select * from characters");
            ResultSet rs = ps.executeQuery();
            ResultSetMetaData rsMeta = rs.getMetaData();
            String colTitle = rsMeta.getColumnName(1);

            model = new DefaultTableModel(new String[]{colTitle}, 0);

            while (rs.next()) {
                String name = rs.getString("NAME");
                model.addRow(new Object[]{name});
                File temp = File.createTempFile(name, ".png");
                Blob blob = rs.getBlob("IMG");
                int blobLength = (int) blob.length();
                byte[] bytes = blob.getBytes(1, blobLength);
                blob.free();
                BufferedImage img = ImageIO.read(new ByteArrayInputStream(bytes));
                ImageIO.write(img, "png", temp);

                URL fileURL = temp.toURI().toURL();
                fileMap.put(name, fileURL);
            }

        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return model;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new TableToolTip();
            }
        });
    }
}


Answer 2:

  • 每个键和鼠标事件中的TableCellRenderer immediatelly解雇,然后从长且重的JDBC任务从产生异常的RepaintManager,不这样做,也没有打开JDBC连接,产生了一堆键和鼠标活动,尤其是鼠标事件的每各像素的

  • 加载所有图片到本地变量图标/ ImageIcon的,事件。 到图标/ ImageIcon的阵列,



文章来源: How to get an image to the database, and set it as a “tooltipText()” for the table for a specific row