2013-09-28 37 views
1

我是java swing的新手。我试图在表格单元格中添加图标。但是当我在单元格中添加ImageIcon时,它只显示路径而不是图标。为什么在表格单元中显示路径而不是图标

这是我的代码。

public void createGUI(ArrayList<String> params, String type) { 

    try { 
     DefaultTableModel model = new DefaultTableModel(); 
     model.addColumn("ParameterName"); 
     model.addColumn("ParameterType"); 
     model.addColumn("Operation"); 
     for (int i = 0; i < params.size() - 4; i++) { 
      String param_name = params.get(i).toString().substring(0, params.get(i).toString().indexOf("[")); 
      String param_type = params.get(i).toString().substring(params.get(i).toString().indexOf("[") + 1, params.get(i).toString().indexOf("]")); 
      //URL url = ClassLoader.getSystemClassLoader().getResource(""); 
      ImageIcon image = new ImageIcon("/com/soastreamer/resources/delete_idle.png"); 
      // JLabel label = new JLabel(image); 
      model.addRow(new Object[]{param_name, param_type.toUpperCase(),image}); 

     } 


     Action delete = new AbstractAction() { 

      public void actionPerformed(ActionEvent e) { 
       JTable table = (JTable) e.getSource(); 
       int modelRow = Integer.valueOf(e.getActionCommand()); 
       ((DefaultTableModel) table.getModel()).removeRow(modelRow); 
      } 
     }; 

这里是图像清晰的理解。

enter image description here

请给我暗示或任何引用。 谢谢。

回答

4

问题在于您的TableModel,您必须告诉表必须在该列中呈现图像,覆盖该模型的getColumnClass(int column)方法。

看看这个由camickr answer

UPDATE一个JTable中使用的DefaultTableModel的渲染器把它漆成一个ImageIcon

小例子。我用camickr再次从this answer中借用了updateRowHeights()代码,没有它,图标比这行更大并且没有完全显示。

这里重要的是,现在当渲染器调用getColumnClass(1)时,它得到ImageIcon.class,所以渲染图标的代码将被执行。默认情况下,此方法将返回Object.class,渲染器将忽略它是图标的事实。

import java.awt.BorderLayout; 
import java.awt.Component; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.table.DefaultTableModel; 

public class ImageIconTable 
{ 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new ImageIconTable().initGUI(); 
      } 
     }); 
    } 

    public void initGUI() 
    { 
     JFrame frame = new JFrame();   
     DefaultTableModel tableModel = new DefaultTableModel() 
     { 
      @Override 
      public Class getColumnClass(int column) 
      { 
       if (column == 1) return ImageIcon.class; 
       return Object.class; 
      } 
     }; 
     tableModel.addColumn("Row 1"); 
     tableModel.addColumn("Icons Row"); 
     tableModel.addRow(new Object[]{"This cell is an Object", new ImageIcon("icon.jpg")}); 
     _table = new JTable(tableModel); 

     updateRowHeights(); 

     frame.add(new JScrollPane(_table), BorderLayout.CENTER); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private void updateRowHeights() 
    { 
     try 
     { 
      for (int row = 0; row < _table.getRowCount(); row++) 
      { 
       int rowHeight = _table.getRowHeight(); 

       for (int column = 0; column < _table.getColumnCount(); column++) 
       { 
        Component comp = _table.prepareRenderer(_table.getCellRenderer(row, column), row, column); 
        rowHeight = Math.max(rowHeight, comp.getPreferredSize().height); 
       } 
       _table.setRowHeight(row, rowHeight); 
      } 
     } 
     catch(ClassCastException e) {} 
    } 

    private JTable _table; 
} 

它看起来像这样:

Table displaying an icon

+0

你可以更新我的代码..我是java swing上的新手,所以我不明白如何做到这一点? –

+1

@SandipArmalPatil不,我不能更新你的代码,但看到我的更新与上面的例子。你必须将它集成到你的代码中。 – DSquare

0

首先,我建议您使用ImageIo.read()并使用为您的ImageIcon对象返回的作为参数的BufferedImage。 其次,使用Class.getResource()设施

YourClass.class.getResource("/com/soastreamer/resources/delete_idle.png"); 

然后,一切都应该工作。

+0

没有,他的ImageIcon的代码是正确的,问题是,他呈现的ImageIcon作为对象。 – DSquare

+0

哦,对了,因此图像资源的toString()路径:) – Polentino

相关问题