Java 如何将图像获取到数据库,并将其设置为;tooltipText();用于特定行的表
我正在创建一个程序,上面有一个JTable,由我的数据库数据填充。每一行上都有相应的图片,所以我想做的是,当我将鼠标光标放在那一行上时,它会弹出一个包含图片的ToolTiptTextJava 如何将图像获取到数据库,并将其设置为;tooltipText();用于特定行的表,java,swing,jdbc,jtable,tooltip,Java,Swing,Jdbc,Jtable,Tooltip,我正在创建一个程序,上面有一个JTable,由我的数据库数据填充。每一行上都有相应的图片,所以我想做的是,当我将鼠标光标放在那一行上时,它会弹出一个包含图片的ToolTiptText tblListOfInmates = new JTable(){ private static final long serialVersionUID = 8240878564742150750L; pu
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连接,会生成一堆键和鼠标事件,尤其是每像素的鼠标事件
- 将所有图像作为图标/图像图标、事件加载到局部变量。到图标/图像图标的数组
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();
}
});
}
}