5

我可以设置列的标题,但无法在 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 循环,但还没有让行迭代来设置图标。或者还有其他方法吗?

4

3 回答 3

10

无需创建自定义渲染。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();
            }
        });
    }

}
于 2011-04-10T23:48:08.747 回答
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 编码标准指定类名应以大写字母开头,因此iconRendererIconRenderer改为大写字母。

于 2011-04-10T21:43:41.247 回答
0

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

我将在此处发布如何在不使用 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")): ""
    });
});
于 2020-10-12T23:08:27.423 回答