有没有人有在同一列中一起显示 Icon 和 String 的 JTable 示例代码?

Does anyone have sample code of JTable that shows Icon and String together in a same column?

我想知道是否有人可以提供一个简单的 JTable 示例,该示例在一个单元格中同时显示图标和字符串值。

我可以构建一个 JTable,该 JTable 的列可以只包含 Icon 或 String,但不能同时包含在一个单元格中。

希望有人能给我一个例子...

附上我的代码, 在 post 问题之前,我通常会简化代码,但这次不知道如何解决...请原谅我附上了

package jtableWithIcon;

import java.awt.Component;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class Renderer extends DefaultTableCellRenderer{

    public void fillColor(JTable t,JLabel l,boolean isSelected ){
    //setting the background and foreground when JLabel is selected
        if(isSelected){
            l.setBackground(t.getSelectionBackground());
            l.setForeground(t.getSelectionForeground());
        }
        else{
            l.setBackground(t.getBackground());
            l.setForeground(t.getForeground());
        }

    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                                                    boolean hasFocus, int row, int column){
        if(value instanceof JLabel){
            ImageIcon imageIcon = new ImageIcon();
            JLabel label = (JLabel)value;
            //you can add the image here

            label.setIcon(new ImageIcon(getClass().getResource("icon.png")));   
        //*****NullPointException occurs here in thread "AWT-EventQueue-0"....
       //*********************************************

        label.setOpaque(true);
        fillColor(table,label,isSelected);

        return label;
    }
    else {
        return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    }
 }
}

package jtableWithIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class MainMyTableTest extends JFrame{

    public MainMyTableTest(String title){
        super(title);
        showGUI();
    }

    public void showGUI(){
        JTable table = new JTable();
        table.setModel(new MyModel());//invoking our custom model
        table.setDefaultRenderer(JLabel.class,  new Renderer());// for the rendering of cell
        JScrollPane jp = new JScrollPane(table);
        getContentPane().add(jp);
        setVisible(true);
        setSize(500,300);
    }

    public static void main(String[] args) {
        MainMyTableTest t = new MainMyTableTest("Table Custom");
    }
}

package jtableWithIcon;

import javax.swing.JLabel;

class MyModel extends javax.swing.table.DefaultTableModel{

    Object[][] row = {{new JLabel("Row 1 Col 1"), "Row 1 Col 2", "Row 1 Col3"},
                      {new JLabel("Row 2 Col 1"), "Row 2 Col 2", "Row 2 Col3"},
                      {new JLabel("Row 3 Col 1"), "Row 3 Col 2", "Row 3 Col3"},
                      {new JLabel("Row 4 Col 1"), "Row 4 Col 2", "Row 4 Col3"}};

    Object[] col = {"Column 1", "Column 2", "Column 3"};

    public MyModel (){

    //Adding columns
        for(Object c: col)
            this.addColumn(c);

    //Adding rows
        for(Object[] r: row)
            addRow(r);
    }

    @Override
    public Class getColumnClass(int columnIndex) {
        if(columnIndex == 0)
            return getValueAt(0, columnIndex).getClass();

        else 
            return super.getColumnClass(columnIndex);

    }
}

这些代码是从互联网上截取的... 我试图通过研究这个来理解 Render 是如何工作的。 但渲染器发生错误 class..

不要在 TableModel 中存储 JLabel。 JLabel 占用太多资源。

而是创建一个具有两个属性的自定义对象(比如说 IconTextItem):1) 文本和 2) 图标。

那么您的自定义渲染器将类似于:

class IconTextRenderer extends DefaultTableCellRenderer
{
    @Override
    public Component getTableCellRendererComponent(
        JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        IconTextItem item = (IconTextItem)value;
        setText( item.getText );
        setIcon( item.getIcon );

        return this;
    }
}

然后将渲染器添加到 table,代码如下:

table.getColumnModel().getColumn(0).setCellRenderer( new IconTextRenderer );

我找到了如何让它发挥作用。

label.setIcon(new ImageIcon(getClass().getResource("icon.png")));

这一行必须与下面一行一起使用。

label.setIcon(new ImageIcon("icon.png));

此外,有人想要渲染 JLabel 以将其放在任何组件上, 答案在这里How to add icon near arrow icon for JComboBox

谢谢。