2016-04-24 14 views
0

私は3列のjtableを持っていて、最初の2列にImageiconと文字列があります。jtableに画像の隣にテキストを追加するには?

現在、私は、私はこれを見つけましたが、...に行くのか分からない、またはこれとJTableの中でイメージアイコンと文字列を設定する方法を

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); 

ようImageIconsを表示しています:

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

ご協力いただければ幸いです。

答えて

1

私はこれが、中に入るかわからない...またはこれにJTableの中でイメージアイコンと文字列を設定する方法を見つけました:

あなたは(カスタムオブジェクトを作成する必要が発言権をすることができます表示する情報を保持するためにMyCustomObjectという名前を付けます)。したがって、カスタムオブジェクトには、アイコンとテキストの2つのプロパティがあります。

次に、テーブル内の他のオブジェクトと同様に、オブジェクトを作成してTableModelに追加します。

あなたは最初の2つの列のためのMyCustomObjectを返すためのgetColumnClass()メソッドをオーバーライドする必要があります。次に、MyCustomObjectのカスタムレンダラーも設定する必要があります。 JLabelある

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

DefaultTableCellRendererので、あなたはそれがアイコンにラベルを付けるために、カスタムrendererでテキストの配置プロパティをです使用することができます。

は、それではレンダリングコードであなたのような何かをするだろう。以下の例は、可視性を確保するためにgetRowHeight()を上書きしています。私は、hereのように、updatedカスタムクラスを使用する例を持っています。 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(); 
     }); 
    } 
} 
関連する問題