【问题标题】:How to set icon in a column of JTable?如何在 JTable 的一列中设置图标?
【发布时间】:2011-08-02 15:51:10
【问题描述】:

我可以设置列的标题,但不能在 JTable 的第一列的所有行中设置图标。

public class iconRenderer extends DefaultTableCellRenderer{
    public Component getTableCellRendererComponent(JTable table,Object obj,boolean isSelected,boolean hasFocus,int row,int column){
        imageicon i=(imageicon)obj;
        if(obj==i)
            setIcon(i.imageIcon);
        setBorder(UIManager.getBorder("TableHeader.cellBorder"));
        setHorizontalAlignment(JLabel.CENTER);
        return this;
    }
}

public class imageicon{
    ImageIcon imageIcon;
    imageicon(ImageIcon icon){
        imageIcon=icon;
    }
}  

我的 BuildTable() 方法中的以下行。

    public void SetIcon(JTable table, int col_index, ImageIcon icon){
      table.getTableHeader().getColumnModel().getColumn(col_index).setHeaderRenderer(new iconRenderer());
      table.getColumnModel().getColumn(col_index).setHeaderValue(new imageicon(icon));
}

我们如何为第一列的所有行设置它?我已经尝试过 for 循环,但还没有让行迭代来设置图标。或者有没有其他办法?

【问题讨论】:

  • 这段代码现在做了什么?它具体有什么问题。
  • 还有什么是 imageicon 类。只需将图像存储在该列中并直接使用它,而不是处理其他类。
  • 它的设置列的标题只是。但想把图标放在第一列的所有行。

标签: java swing jtable tablemodel cellrenderer


【解决方案1】:

无需创建自定义渲染。 JTable 已经支持图标渲染器。你只需要告诉表格使用这个渲染器。这是通过覆盖表模型的 getColumnClass(...) 方法来完成的:

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

public class TableIcon extends JPanel
{
    public TableIcon()
    {
        Icon aboutIcon = new ImageIcon("about16.gif");
        Icon addIcon = new ImageIcon("add16.gif");
        Icon copyIcon = new ImageIcon("copy16.gif");

        String[] columnNames = {"Picture", "Description"};
        Object[][] data =
        {
            {aboutIcon, "About"},
            {addIcon, "Add"},
            {copyIcon, "Copy"},
        };

        DefaultTableModel model = new DefaultTableModel(data, columnNames)
        {
            //  Returning the Class of each column will allow different
            //  renderers to be used based on Class
            public Class getColumnClass(int column)
            {
                return getValueAt(0, column).getClass();
            }
        };
        JTable table = new JTable( model );
        table.setPreferredScrollableViewportSize(table.getPreferredSize());

        JScrollPane scrollPane = new JScrollPane( table );
        add( scrollPane );
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("Table Icon");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new TableIcon());
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

}

【讨论】:

    【解决方案2】:

    您只是使用 iconRenderer 来呈现您的标题。还将 Column 的 Cell Renderer 设置为 iconRenderer 的一个实例。在专栏上拨打setCellRenderer

    http://download.oracle.com/javase/6/docs/api/javax/swing/table/TableColumn.html#setCellRenderer(javax.swing.table.TableCellRenderer)

    附注:Java 编码标准规定类名应以大写字母开头,因此iconRenderer 应改为IconRenderer

    【讨论】:

      【解决方案3】:

      我知道这篇文章有点老了,但永远不会太晚......

      我将在此处发布如何在不使用 DefaultTableCellRenderer 类的情况下插入图标,我将其用于仅以简单的方式在屏幕上显示图标时使用它。

      我以一种简单的方式来做......我总是在我继承的类中创建一些表模型创建者。我通常通过参数传递对象的标题和类型列表。

      在上层类中创建tablemodel的方法:

      protected void createTableModel(String[] columns, Class[] types){
          String[] vetStr = new String[columns.length];
          boolean[] vetBoo = new boolean[columns.length];
          Arrays.fill(vetStr, null);
          Arrays.fill(vetBoo, false);
          table.setModel(new javax.swing.table.DefaultTableModel(
              new Object [][] { vetStr },
              columns
          ) {
              boolean[] canEdit = vetBoo;
              public Class getColumnClass(int columnIndex) {
                  return types [columnIndex];
              }
              public boolean isCellEditable(int rowIndex, int columnIndex) {
                  return canEdit [columnIndex];
              }
          });
          table.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
      }
      

      继承类构造函数:

      “看到这里我为列设置了类型为ImageIcon.class”

      ....构造函数....

      super("Balança");        
      String[] columns = {"#", "Nome", "Porta", "Padrão"};
      Class[] types = {Long.class, String.class, String.class, ImageIcon.class};
      **strong text**super.createTableModel(columns, types);
      

      当我在 tablemodel 上列出项目时,我会显示图像。

      list.forEach( obj -> {
          tableModel.addRow(new Object[]{
              obj.getId(),
              obj.getName(),
              obj.getPort(),
              (obj.getId() == Global.standardScale)? 
              new ImageIcon(getClass().getResource("./br/com/valentin/img/accept.png")): ""
          });
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-16
        • 1970-01-01
        • 2018-12-23
        • 1970-01-01
        • 2011-08-14
        • 2011-04-02
        • 2015-01-14
        相关资源
        最近更新 更多