Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将图像获取到数据库,并将其设置为;tooltipText();用于特定行的表_Java_Swing_Jdbc_Jtable_Tooltip - Fatal编程技术网

Java 如何将图像获取到数据库,并将其设置为;tooltipText();用于特定行的表

Java 如何将图像获取到数据库,并将其设置为;tooltipText();用于特定行的表,java,swing,jdbc,jtable,tooltip,Java,Swing,Jdbc,Jtable,Tooltip,我正在创建一个程序,上面有一个JTable,由我的数据库数据填充。每一行上都有相应的图片,所以我想做的是,当我将鼠标光标放在那一行上时,它会弹出一个包含图片的ToolTiptText tblListOfInmates = new JTable(){ private static final long serialVersionUID = 8240878564742150750L; pu

我正在创建一个程序,上面有一个JTable,由我的数据库数据填充。每一行上都有相应的图片,所以我想做的是,当我将鼠标光标放在那一行上时,它会弹出一个包含图片的ToolTiptText

 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;
                    }
            };
我不知道如何正确地做到这一点,我也不知道我的想法是否正确。请告诉我你是否有比这个更好的主意=)

  • 每个键和鼠标事件都会在TableCellRenderer中立即触发,然后从冗长繁重的JDBC任务中生成RepaitManager异常,不要这样做,也不要打开JDBC连接,会生成一堆键和鼠标事件,尤其是每像素的鼠标事件

  • 将所有图像作为图标/图像图标、事件加载到局部变量。到图标/图像图标的数组


我猜您试图加载到工具提示中的图像是数据库中的斑点。问题是不能从数据库对象生成url。您可以将url存储在数据库中,指向文件系统中的url,但我认为这可能是不可能的,因为您不希望在数据库和文件系统中都有图像

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

还请注意,您将希望在后台线程中执行此操作。看

然后,您可以从文件系统访问这些图像,这将比尝试一次一个从db访问要高效得多。然后,您可以使用
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();
            }
        });
    }
}

导入java.awt.Component;
导入java.awt.image.buffereImage;
导入java.io.ByteArrayInputStream;
导入java.io.File;
导入java.net.URL;
导入java.sql.Blob;
导入java.sql.Connection;
导入java.sql.DriverManager;
导入java.sql.PreparedStatement;
导入java.sql.ResultSet;
导入java.sql.ResultSetMetaData;
导入java.util.HashMap;
导入java.util.Map;
导入javax.imageio.imageio;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.SwingUtilities;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.TableCellRenderer;
公共类表格工具提示{
私有映射文件映射;
公共表工具提示(){
fileMap=newhashmap();
JTable table=createTable();
JFrame=新JFrame();
frame.add(新的JScrollPane(表));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
私有JTable createTable(){
JTable table=新的JTable(createModel()){
公共组件预渲染器(TableCellRenderer渲染器,int行,int列){
组件c=super.prepareRenderer(呈现器、行、列);
if(JComponent的c实例){
JComponent jc=(JComponent)c;
URL=fileMap.get((字符串)getValueAt(行、列));
字符串html=“”
+ " ";
jc.setToolTipText(html+“
” +getValueAt(行、列).toString()的值 +:行,列(“+行+”,“+列+”) + ""); } 返回c; } }; 返回表; } 私有DefaultTableModel createModel(){ DefaultTableModel=null; 试一试{ Class.forName(“com.mysql.jdbc.Driver”); 连接连接=DriverManager.getConnection( “jdbc:mysql://localhost/mario“,”根“,”密码“); PreparedStatement ps=conn.prepareStatement(“从字符中选择*); 结果集rs=ps.executeQuery(); ResultSetMetaData rsMeta=rs.getMetaData(); 字符串colTitle=rsMeta.getColumnName(1); model=newdefaulttablemodel(新字符串[]{colTitle},0); while(rs.next()){ 字符串名称=rs.getString(“名称”); addRow(新对象[]{name}); File temp=File.createTempFile(名称“.png”); Blob Blob=rs.getBlob(“IMG”); int blobLength=(int)blob.length(); byte[]bytes=blob.getBytes(1,blobLength); blob.free(); BuffereImage img=ImageIO.read(新的ByteArrayInputStream(字节)); 图像写入(img,“png”,temp); URL fileURL=temp.toURI().toURL(); put(名称、文件URL); } }捕获(例外情况除外){ 例如printStackTrace(); } 收益模型; } 公共静态void main(字符串[]args){ SwingUtilities.invokeLater(新的Runnable(){ 公开募捐{ 新建表格工具提示(); } }); } }
这是文件系统中的实际文件吗
新文件(rs.getString(“ID”))
?如果没有,它将不起作用。请注意,html已断开,因为您要设置为工具提示文本的字符串末尾缺少
。而且
关闭标记丢失
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();
            }
        });
    }
}