2016-04-24 105 views
0

我有一個三列jtable,並希望前兩列有一個Imageicon和一個字符串在它旁邊。如何在jtable中添加圖片旁邊的文字?

目前我顯示ImageIcons像

DefaultTableModel model = new DefaultTableModel(rows, columns) { 
          @Override 
          public Class<?> getColumnClass(int column) { 
           switch (column) { 
            case 0: 
            case 1: 
             return ImageIcon.class; 
            case 2: 
             return String.class; 
            default: 
             return Object.class; 
           } 
          } 
         }; 

jTable.setModel(model); 

我發現這一點,但不知道在...發生的事情或如何設置JTable中的ImageIcon和字符串與此:

Java - Is it possible to put an image and a String in the same JTable cell?

任何幫助將不勝感激。

回答

1

我沒有發現這一點,但不知道......發生的事情或如何設置JTable中的ImageIcon和字符串與此:

您需要創建自定義對象(可以說你稱之爲MyCustomObject)來保存你想要顯示的信息。所以你的自定義對象將有兩個屬性:圖標和文本。

然後,您創建對象並將其添加到TableModel中,就像您爲表中的任何其他對象一樣。

您需要重寫getColumnClass()方法以返回前兩列的MyCustomObject。然後您還需要設置MyCustomObject的自定義渲染器。

所以後來在渲染代碼,你會做這樣的事情:

MyCustomObject data = (MyCustomObject)value; 
setIcon(data.getIcon()); 
setText(data.getText()); 
1

因爲DefaultTableCellRendererJLabel,你可以使用它的文本對齊屬性在自定義renderer標記的圖標。下面的示例將覆蓋getRowHeight()以確保可見性。我已經使用updated示例來使用自定義類,如建議here; LabelIcon的實例爲每一行保存一個圖標和標籤對。

image

import java.awt.*; 
import javax.swing.*; 
import javax.swing.table.*; 

/** 
* @see https://stackoverflow.com/a/36830558/230513 
*/ 
public class TableExample { 

    private JFrame frame = new JFrame("Table Demo"); 
    private Icon errorIcon = (Icon) UIManager.getIcon("OptionPane.errorIcon"); 
    private Icon infoIcon = (Icon) UIManager.getIcon("OptionPane.informationIcon"); 
    private Icon warnIcon = (Icon) UIManager.getIcon("OptionPane.warningIcon"); 
    private String[] columnNames = {"String", "Icon"}; 
    private Object[][] data = { 
     {"One", new LabelIcon(errorIcon, "Error")}, 
     {"Two", new LabelIcon(infoIcon, "Information")}, 
     {"Three", new LabelIcon(warnIcon, "Warning")}, 
     {"Four", new LabelIcon(errorIcon, "Error")}, 
     {"Five", new LabelIcon(infoIcon, "Information")}, 
     {"Six", new LabelIcon(warnIcon, "Warning")}}; 
    private final TableModel model = new DefaultTableModel(data, columnNames) { 

     @Override 
     public Class<?> getColumnClass(int column) { 
      switch (column) { 
       case 0: 
        return String.class; 
       case 1: 
        return LabelIcon.class; 
       default: 
        return String.class; 
      } 
     } 
    }; 

    private static class LabelIcon { 

     Icon icon; 
     String label; 

     public LabelIcon(Icon icon, String label) { 
      this.icon = icon; 
      this.label = label; 
     } 
    } 

    private static class LabelIconRenderer extends DefaultTableCellRenderer { 

     public LabelIconRenderer() { 
      setHorizontalTextPosition(JLabel.CENTER); 
      setVerticalTextPosition(JLabel.BOTTOM); 
     } 

     @Override 
     public Component getTableCellRendererComponent(JTable table, Object 
      value, boolean isSelected, boolean hasFocus, int row, int col) { 
      JLabel r = (JLabel) super.getTableCellRendererComponent(
       table, value, isSelected, hasFocus, row, col); 
      setIcon(((LabelIcon) value).icon); 
      setText(((LabelIcon) value).label); 
      return r; 
     } 
    } 

    public TableExample() { 
     JTable table = new JTable(model) { 
      @Override 
      public int getRowHeight() { 
       return super.getRowHeight() + infoIcon.getIconHeight(); 
      } 

      @Override 
      public Dimension getPreferredScrollableViewportSize() { 
       return new Dimension(
        (5 * super.getPreferredSize().width)/4, 
        4 * this.getRowHeight()); 
      } 
     }; 
     table.setAutoCreateRowSorter(true); 
     table.setDefaultRenderer(LabelIcon.class, new LabelIconRenderer()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new JScrollPane(table)); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(() -> { 
      TableExample tableExample = new TableExample(); 
     }); 
    } 
}