【问题标题】:Inserting images into JTable cell with GTKLookAndFeel使用 GTKLookAndFeel 将图像插入 JTable 单元格
【发布时间】:2016-04-03 18:47:56
【问题描述】:

问题似乎出在 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"

我意识到我可以切换我的外观和感觉,但有没有理由这不适用于 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 source 中获取了 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);
    }
}

【问题讨论】:

    标签: java swing jtable icons look-and-feel


    【解决方案1】:

    你可以随时添加:

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

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

    有没有办法绕过它?

    如果它为空,那么您知道 GTK 没有默认渲染器,因此您需要创建自己的图标渲染器。查看 Using Custom Renderers 上的 Swing 教程部分了解更多信息。

    【讨论】:

    • 表格的默认渲染器似乎不为空,我已将结果添加到我的问题中。不过,我会试一试自定义渲染器。
    • 使用自定义默认渲染器有效,谢谢!它不会自己渲染它仍然没有意义。
    • @Matthew,哎呀,你是对的,它永远不会为空,因为即使没有特定的图标渲染器,也会返回默认的对象渲染器,这就是你得到 toString(.. ) 图标的表示。当我打印出值时,我得到javax.swing.JTable$IconRenderer。看起来您只是获得了默认的对象渲染器,因为我在任何地方都没有看到名称中的图标。
    猜你喜欢
    • 2021-08-28
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    相关资源
    最近更新 更多