2013-09-28 80 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

相關問題