使用GTKLookAndFeel将图像插入JTable单元格



问题似乎是Linux/Ubuuntu的系统外观,因为它可以在Windows和其他外观中工作。我似乎找不到任何办法来解决这个问题。我目前使用的是Ubuntu 15.10。

// Set my look and feel in main()
// Printed out: "com.sun.java.swing.plaf.gtk.GTKLookAndFeel"
try {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Throwable e) {}

// I set my table to render images inside the ui method. Works with every other look and feel.
ImageIcon document = new ImageIcon(Toolkit.getDefaultToolkit().getImage(this.getClass().getResource("/test/documents.png")));
DefaultTableModel model = new DefaultTableModel(new Object[]{"A","B"},0);
table = new JTable(model);
table.setRowHeight(document.getIconHeight());
table.getColumnModel().getColumn(0).setCellRenderer(table.getDefaultRenderer(ImageIcon.class));
for(int i=0; i<10; i++)
    model.addRow(new Object[]{document,i});
// When the L&F is set to GTK, the table will just print out Object.toString()
// For example: "javax.swing.ImageIcon@e957ef0"

我意识到我可以改变我的外观和感觉,但这对GTK不起作用是有原因的吗?有办法绕过它吗?

当打印出表的table.getDefaultRenderer(Icon.class)时,它不是空的,但返回以下内容:

javax.swing.plaf.synth.SynthTableUI$SynthTableCellRenderer[Table.cellRenderer,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.synth.SynthBorder@3d04a311,flags=8388608,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,horizontalAlignment=LEADING,horizontalTextPosition=TRAILING,iconTextGap=4,labelFor=,text=,verticalAlignment=CENTER,verticalTextPosition=CENTER]

使用自定义默认渲染器可以工作。我从JTable源代码中获得了IconRenderer类,该类修复了在制作自定义渲染器时出现的新问题,例如图像居中,并且没有指示您选择了单元格。

import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.table.DefaultTableCellRenderer;
class IconRenderer extends DefaultTableCellRenderer.UIResource {
    public IconRenderer() {
        super();
        setHorizontalAlignment(JLabel.CENTER);
    }
    public void setValue(Object value) {
        setIcon((value instanceof Icon) ? (Icon) value : null);
    }
}

你总是可以添加一个:

 System.out.println( table.getDefaultRenderer(Icon.class) );

语句,查看返回的内容。我总是使用图标,所以任何类型的图标都可以显示。

有办法绕过它吗?

如果它为null,那么您知道GTK没有默认的渲染器,所以您需要创建自己的图标渲染器。有关详细信息,请查看Swing教程中关于使用自定义渲染器的部分。

最新更新