【问题标题】:Images are blank in JTableJTable中的图像是空白的
【发布时间】:2011-09-26 03:18:36
【问题描述】:

我正在尝试将图像添加到 JTable 中的列,但当列被填充时它们显示为空白。

我正在重写 getColumnClass。这是表声明...

   laneTable.setModel(new javax.swing.table.DefaultTableModel(
        new Object [][] {
            {null, null, null, null, null, null},
            {null, null, null, null, null, null},
            {null, null, null, null, null, null},
            {null, null, null, null, null, null}
        },
        new String [] {
            "Lane ID", "Status", "Traffic", "Gate Arm", "Lane Indicator", "Temperature"
        }
    ) {
        Class[] types = new Class [] {
            java.lang.String.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class
        };

        @Override
        public Class getColumnClass(int column)
        {

            if (column == 4)
            {

                return ImageIcon.class;
            }
            return Object.class;
            // other code; default to Object.class
        }


    });

很明显,第 4 列是我要显示图像的列。我正在用..填充我的桌子。

for(int i = 0; i < 200; i++){
  ImageIcon icon = new ImageIcon("Images/test.jpg");
  laneTable.getModel().setValueAt(icon,i,4);
}

我的图片路径是 /src/Images/test.jpg 以防我的路径名不正确... 上周我一直在处理这个问题,但我不明白为什么这些图像在我的表格中一直显示为空白。

想法?

edit 我猜这里是 SSCCE。不知道它是否会起作用..

import javax.swing.table.DefaultTableModel;
import javax.swing.*;

import java.awt.event.*;
import java.awt.*;

public class LaneGUI extends javax.swing.JApplet implements Runnable {
    private Connection connection;
private XMLParser xmlParser;
private laneData laneData;
private SiteData siteData;
private Thread connectionThread;


public void init() {        


    try {
        java.awt.EventQueue.invokeAndWait(new Runnable() {

            public void run() {                    
                initComponents();                  
              ImageIcon icon = new ImageIcon("Images/test.jpg");

               for(int i = 0; i < 200; i++){
          laneTable.getModel().setValueAt(icon,i,4);
            }

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


}   


/** This method is called from within the init() method to
 * initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is
 * always regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")   




// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {


    jScrollPane1 = new javax.swing.JScrollPane();
    laneTable = new javax.swing.JTable();



    laneTable.setModel(new javax.swing.table.DefaultTableModel(
        new Object [][] {
            {null, null, null, null, null, null},
            {null, null, null, null, null, null},
            {null, null, null, null, null, null},
            {null, null, null, null, null, null}
        },
        new String [] {
            "Lane ID", "Status", "Traffic", "Gate Arm", "Lane Indicator", "Temperature"
        }
    ) {
        Class[] types = new Class [] {
            java.lang.String.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class
        };

        @Override
        public Class getColumnClass(int column)
        {

            if (column == 4)
            {

                return ImageIcon.class;
            }
            return Object.class;
            // other code; default to Object.class
        }


    });
    laneTable.setRowHeight(100);
    jScrollPane1.setViewportView(laneTable);

    });

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(18, 18, 18)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)     
            .addContainerGap())
    );

}// </editor-fold>                        







// Variables declaration - do not modify                     

private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable laneTable;
// End of variables declaration                   
}

edit 测试了新标签中的图像,图像在标签内正确显示,但在表格内仍为空白。

【问题讨论】:

  • 信息不足,无法查看发生了什么。也许您可以创建一个重现问题的简单示例?
  • 如果你可以发布一个 SSCCE,或者至少把你的 getValueAt,setValueAt 方法实现。
  • 呃,也许这是我的问题..这是我实现我想要的所有代码。我错过了什么?我声明一个图像图标,然后将该值设置到表中。而且我已经覆盖了 getcolumnclass 以返回一个 image.class 用于包含图像图标的列。还剩下什么?
  • 您缺少足够的代码,因此我们可以自己编译和运行演示。请查看此链接:SSCCE.

标签: java jtable imageicon


【解决方案1】:

空白图像可能不是路径问题,而是渲染问题。查看该列的 CellRenderer。是使用默认渲染器还是您正在做一些特别的事情。

尝试打印出路径以确保它进入单元格。还可以尝试从JTable 外部访问该路径,以确保根本没有路径问题。

【讨论】:

  • 我已经尝试过创建自己的单元格渲染器,但没有效果。 (虽然我也没有覆盖我的列)如果我不覆盖 getcolumnclass,图像的路径名会打印出来
  • @Jesse,您应该可以使用默认设置,但我不确定您是否创建了自定义设置,因为您没有提及您计划如何渲染单元格。尝试在 JLable 中显示 JTable 之外的项目或其他内容以验证路径和资源是否正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 2019-03-26
  • 2014-11-07
  • 2017-02-07
  • 1970-01-01
相关资源
最近更新 更多