how to set an image for jtable fixed column, when i am running, it's getting an image path only
我创建了一个程序来在 jtable 固定列中设置一个 imageIcon,我创建了一个 jtable 并获取数据库记录,然后将第一列设置为固定列。我在固定列中设置了一个图像图标。当我编译这个程序时,我只得到一个 imageicon 的路径,没有得到一个图像。我在项目包文件夹中修复了一个 imageIcon。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | This is the code i used public void Frm_FlxD_Database() { try{ TmpRow=0; TmpMainPrj.PRJ_DB_CONNECTION_ASSGN(); TmpFlxMdl =(DefaultTableModel)FlxD.getModel(); TmpFlxDRow = 0; TmpFlxSt=TmpGPrjVarDec.GContn.createStatement(); TmpFlxDRs=TmpFlxSt.executeQuery("SELECT * from activitymaster"); PRJ_FLX_DEFTL_ASSGN(FlxD,"BEGIN"); TmpFlxDRs.first(); do { FlxD.setValueAt(TmpFlxDRs.getString("ACTVTYDESC"), TmpRow,1); FlxD.setValueAt(TmpFlxDRs.getString("ACTVTYCODE"), TmpRow,2); FlxD.setValueAt(TmpFlxDRs.getString("DISPSTATUS"), TmpRow,3); FlxD.setValueAt(TmpFlxDRs.getString("ACTVTYID"), TmpRow,4); TmpFlxMdl.addRow(new Object[]{""}); TmpRow = TmpRow + 1; }while(TmpFlxDRs.next()); FRM_FLXD_PTR_DATA_ASSGN(TmpFlxDRow); } catch(Exception e){ System.out.println(e); } } private void FRM_FLXD_PTR_DATA_ASSGN(int PFlxRow) { TmpFlxDRow = PRJ_FLX_PTR_ASSGN(FlxD, PFlxRow, TmpFlxDRow); } private int PRJ_FLX_PTR_ASSGN(JTable PFlx, int PCurRow, int PPrvRow) { ImageIcon TmpIcon; System.out.println(PCurRow); System.out.println(PPrvRow); if (PCurRow != PPrvRow){ TmpIcon = new ImageIcon(getClass().getResource("Blank.gif")); PFlx.setValueAt(TmpIcon,PPrvRow,0); System.out.println(TmpIcon); } TmpIcon = new ImageIcon(getClass().getResource("Pointer.gif")); PFlx.setValueAt(TmpIcon,PCurRow,0); System.out.println(TmpIcon); return(PCurRow); } |
JTable认识Icon/ImageIcon,简单例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.EventQueue; import javax.swing.*; import javax.swing.table.*; public class TableIcon extends JFrame implements Runnable { private static final long serialVersionUID = 1L; private JTable table; private JLabel myLabel = new JLabel("waiting"); private int pHeight = 40; private boolean runProcess = true; private int count = 0; public TableIcon() { ImageIcon errorIcon = (ImageIcon) UIManager.getIcon("OptionPane.errorIcon"); ImageIcon infoIcon = (ImageIcon) UIManager.getIcon("OptionPane.informationIcon"); ImageIcon warnIcon = (ImageIcon) UIManager.getIcon("OptionPane.warningIcon"); String[] columnNames = {"Picture","Description"}; Object[][] data = {{errorIcon,"About"}, {infoIcon,"Add"}, {warnIcon,"Copy"},}; DefaultTableModel model = new DefaultTableModel(data, columnNames); table = new JTable(model) { private static final long serialVersionUID = 1L; // Returning the Class of each column will allow different // renderers to be used based on Class @Override public Class getColumnClass(int column) { return getValueAt(0, column).getClass(); } }; table.setRowHeight(pHeight); table.setPreferredScrollableViewportSize(table.getPreferredSize()); JScrollPane scrollPane = new JScrollPane(table); add(scrollPane, BorderLayout.CENTER); myLabel.setPreferredSize(new Dimension(200, pHeight)); myLabel.setHorizontalAlignment(SwingConstants.CENTER); add(myLabel, BorderLayout.SOUTH); EventQueue.invokeLater(new Runnable() { public void run() { } }); new Thread(this).start(); } public void run() { while (runProcess) { try { Thread.sleep(750); } catch (Exception e) { e.printStackTrace(); } SwingUtilities.invokeLater(new Runnable() { @Override public void run() { ImageIcon myIcon = (ImageIcon) table.getModel().getValueAt(count, 0); String lbl ="JTable Row at : " + count; myLabel.setIcon(myIcon); myLabel.setText(lbl); count++; if (count > 2) { count = 0; } } }); } } public static void main(String[] args) { TableIcon frame = new TableIcon(); frame.setDefaultCloseOperation(EXIT_ON_CLOSE); frame.setLocation(150, 150); frame.pack(); frame.setVisible(true); } } |
没有深入了解您的代码,我的猜测是它与您的 tablemodel getColumnClass() 方法有关。有很多教程如何解决这个问题。目前它可能由表 defaultrenderer 为对象呈现。
这个帖子应该对你有帮助。
好消息是,你不必混淆你的代码,它已经很难阅读,甚至更难理解。您可能想阅读一些 Java 代码指南来改进您的代码。
您不应在数据模型中添加图标。您应该添加数据(布尔指示符、字符串等),并为此列使用渲染器,该渲染器将根据列的数据显示适当的图标。
有关单元格渲染器的信息和示例,请参见 http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#editrender。
请学习 Java 命名约定并遵守它们。您的代码不可读。请参阅 http://www.oracle.com/technetwork/java/codeconv-138413.html