Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用GTKLookAndFeel将图像插入JTable单元格_Java_Swing_Jtable_Icons_Look And Feel - Fatal编程技术网

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

Java 使用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

问题似乎在于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.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。看起来您只是得到了默认的对象渲染器,因为我在名称中的任何地方都看不到图标。