如何将图像获取到数据库,并将其设置为表中特定行的“ tooltipText()”

dens14345

我正在创建一个包含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)

我不知道如何正确执行此操作,也不知道我的想法是否正确/正确。请告诉我您是否有比此更好的主意=)

保罗·萨姆索塔

我猜想您试图在工具提示中加载的图像是数据库中的斑点。问题是无法从数据库对象创建URL。可以将url中的url存储到文件系统中的url,但是我认为这可能是不可能的,因为您不想在数据库文件系统中都拥有图像

也许您应该在加载时将TableModel所有对应的图像(临时)保存到文件系统中。您可以使用来做到这一点File.createTempFile您可以从该img获取URL。

另请注意,您将需要在后台线程中执行此操作。请参见Swing并发

然后,您可以从文件系统访问这些映像,这比尝试一次从db数据库访问更为有效。然后,您可以使用以下格式在html字符串中使用文件系统中的url:File.getUri().getUrl()

您可以使用一种方法来清除这些图像的文件系统。您可能希望在每次加载一组新的表数据时和/或在程序关闭时调用它。

您可以从db 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();
            }
        });
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在BottomNavigationView中禁用tooltipText

setTooltipText()和android:tooltipText在Nougat中不起作用

在工具下方弹出ToolTipText

如何从数据库中获取 BLOB 并将其显示为图像

如何将数据从SQL数据库获取到存储Blob中以获取参考数据

如何将图像上传到Firebase存储并将其添加到数据库?

将数据库数据获取到html表中

如何将表单模型中的数据获取到 Django 中的数据库中

如何将当前日期设置为sqlite中的数据库表名?

如何从数据库中获取数组并将其显示在 laravel 的表中

如何将数据库中的列值获取到jLabels

如何将图像的src绑定到ng-model并将其提取到Angular中?

如何将图像的下载 URL 设置为 Firestore 数据库和实时数据库

如何将列数据移动到另一个表并将其 id 设置为第一个表中的外键列?

如何根据条件从 firebase 数据库中获取图像 url 并将其加载到 ImageView 中?

如何从SQLite数据库读取所有表并将其存储为R中的数据集/变量?

创建MongoDB数据库并将其路径设置为特定文件夹

如何在laravel中使用jquery从数据库中获取特定行并将其绑定到文本框字段

如何将true设置为Firebase数据库中的数据列表

我如何获取当前日期和数据库中的日期之间的差异并将其显示在表中

Haskell Persistent Library - 如何将数据从我的数据库获取到我的前端?

如何将图像 URL 插入数据库中的表中?

如何将 Float Result 转换为 String 并将其保存到 Firebase 数据库中

如何将表情符号作为POST请求传递给Django并将其存储在MySQL数据库中

如何将输入文件中的行分为两部分,然后将其与c#中数据库表的两列数据进行比较?

如何获取图像路径(URI)并将其发送到数据库?

如何将保存在数据库中的图像显示为 longblob?

如何从单个文本框中获取多个值并将其存储在数组中以及如何将其存储在数据库中

如何将Postgres设置为Airflow中的后端数据库?