Java 使用GTKLookAndFeel将图像插入JTable单元格
问题似乎在于Linux/Ubuntu的系统外观,因为它可以在Windows和其他外观中工作。我似乎找不到任何办法来解决这个问题。我目前正在使用Ubuntu 15.10Java 使用GTKLookAndFeel将图像插入JTable单元格,java,swing,jtable,icons,look-and-feel,Java,Swing,Jtable,Icons,Look And Feel,问题似乎在于Linux/Ubuntu的系统外观,因为它可以在Windows和其他外观中工作。我似乎找不到任何办法来解决这个问题。我目前正在使用Ubuntu 15.10 // Set my look and feel in main() // Printed out: "com.sun.java.swing.plaf.gtk.GTKLookAndFeel" try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassN
// 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"
使用自定义默认渲染器可以正常工作。我从中获取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教程部分。您可以随时添加:
System.out.println( table.getDefaultRenderer(Icon.class) );
语句以查看返回的内容。我总是使用图标,所以任何类型的图标都可以显示
有办法绕过它吗
如果为null,则您知道GTK没有默认的渲染器,因此您需要创建自己的图标渲染器。查看上Swing教程的部分以了解更多信息。表的默认呈现器似乎不为空,我已将结果添加到我的问题中。我会给自定义渲染器一个镜头。使用自定义默认渲染器工作,谢谢!仍然没有意义,它不会自己呈现它。@Matthew,哦,你是对的,它永远不会为空,因为即使没有图标的特定呈现器,默认对象呈现器也会返回,这就是为什么你会得到图标的toString(..)表示。当我打印出值时,我得到了javax.swing.JTable$IconRenderer。看起来您只是得到了默认的对象渲染器,因为我在名称中的任何位置都没有看到图标。表的默认渲染器似乎不为null,并且我已将结果添加到我的问题中。我会给自定义渲染器一个镜头。使用自定义默认渲染器工作,谢谢!仍然没有意义,它不会自己呈现它。@Matthew,哦,你是对的,它永远不会为空,因为即使没有图标的特定呈现器,默认对象呈现器也会返回,这就是为什么你会得到图标的toString(..)表示。当我打印出值时,我得到了javax.swing.JTable$IconRenderer。看起来您只是得到了默认的对象渲染器,因为我在名称中的任何地方都看不到图标。