首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >覆盖CellRenderer,ImageIcon消失

覆盖CellRenderer,ImageIcon消失
EN

Stack Overflow用户
提问于 2014-05-16 16:58:35
回答 4查看 475关注 0票数 4

满是鳗鱼的气垫船已经帮了我的忙,给了我一个TableCellRenderer,但现在:我可以画一个没有问题的圆圈。我只是搞不懂最初的ImageIcons(在所有的单元格中)是如何被空的单元格和一个黑色的圆圈所覆盖的。

SSCEE:

代码语言:javascript
复制
package sccee;

import java.awt.Graphics;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.SwingWorker;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

public class SCCEE extends JFrame {

    private JTable spelbordTabel;
    URL url = this.getClass().getResource("/resources/leeg.png");
    ImageIcon leeg = new ImageIcon(new ImageIcon(url).getImage().getScaledInstance(100, 100, java.awt.Image.SCALE_SMOOTH));

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(() -> {
            SCCEE testFrame = new SCCEE();
            testFrame.setBounds(0, 0, 700, 700);
            testFrame.setVisible(true);
        });

    }

    public SCCEE() {
        initComponents();
        updateTableImages();
    }

    private void initComponents() {
        spelbordTabel = new javax.swing.JTable();
        spelbordTabel.setModel(new DefaultTableModel(new Object[][]{
            {null, null, null, null, null, null, null},
            {null, null, null, null, null, null, null},
            {null, null, null, null, null, null, null},
            {null, null, null, null, null, null, null},
            {null, null, null, null, null, null, null},
            {null, null, null, null, null, null, null},
            {null, null, null, null, null, null, null},},
                new String[]{
                    "Title 1", "Title 2", "Title 3", "Title 4", "Title 5", "Title 6", "Title 7"
                }) {

                    @Override
                    public Class
                    getColumnClass(int columnIndex) {
                        return ImageIcon.class;
                    }
                    boolean[] canEdit = new boolean[]{false, false, false, false, false, false, false};

                    @Override
                    public boolean isCellEditable(int rowIndex, int columnIndex) {
                        return canEdit[columnIndex];
                    }

                });
        spelbordTabel.setAutoscrolls(false);
        spelbordTabel.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        spelbordTabel.setOpaque(false);
        spelbordTabel.setRequestFocusEnabled(false);
        spelbordTabel.setRowHeight(100);
        spelbordTabel.setRowSelectionAllowed(false);
        spelbordTabel.setTableHeader(null);
        spelbordTabel.setUpdateSelectionOnSort(false);
        spelbordTabel.setVerifyInputWhenFocusTarget(false);
        spelbordTabel.setBounds(0, 0, 700, 700);
        spelbordTabel.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 4, true));
        spelbordTabel.setDragEnabled(true);
        spelbordTabel.setVisible(true);
        spelbordTabel.getColumn("Title 1").setCellRenderer(
                new DefaultTableCellRenderer() {
                    @Override
                    public void paintComponent(Graphics g) {
                        super.paintComponent(g);
                        g.fillOval(30, 30, 20, 20);
                    }

                }
        );
        add(spelbordTabel);
    }

    public void updateTableImages() {
        SwingWorker<Void, Void> worker2 = new SwingWorker<Void, Void>() {
            @Override
            protected Void doInBackground() throws InterruptedException {
                Thread.sleep(50);
                for (int i = 0; i < 7; i++) {
                    for (int j = 0; j < 7; j++) {
                        spelbordTabel.setValueAt(leeg, i, j);
                    }
                }
                return null;
            }

        };
        worker2.execute();
    }
}

有什么明显的事我错过了吗?(第一次摆弄桌面渲染器)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-05-19 15:46:09

答案是:以某种方式覆盖TabelCellRenderer,也重写了我所覆盖的getColumnClass of DefaultTabelModel。解决方案是使渲染器:

代码语言:javascript
复制
        spelbordTabel.getColumn("Title 1").setCellRenderer(
            new DefaultTableCellRenderer() {
                @Override
                public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                        boolean hasFocus, int row, int column) {
                    Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row,
                            column);
                    ((JLabel) cell).setIcon((Icon) value);
                    ((JLabel) cell).setText("");
                    ((JLabel) cell).setHorizontalAlignment(JLabel.CENTER);
                    return cell;
                }
                @Override
                public void paintComponent(Graphics g) {
                    super.paintComponent(g);
                    g.fillOval(30, 30, 20, 20);
                }

            }
    );
票数 1
EN

Stack Overflow用户

发布于 2014-05-18 02:29:36

我不完全清楚您的实际问题是什么,但是相信您的问题可以通过为您的JTable创建一个自定义表格单元格呈现器来解决,这样每个单元格就可以绘制任何想要的圆。

票数 1
EN

Stack Overflow用户

发布于 2014-05-19 16:07:59

只想对你答案中的“不知何故”作一点解释:

“在某种程度上,凌驾于TabelCellRenderer之上的还覆盖了我所覆盖的getColumnClass of DefaultTabelModel。”

概念:编辑和渲染者如何使用表所述

若要选择显示列中单元格的呈现器,表首先确定是否为该特定列指定了呈现器。如果没有,则表调用表模型的getColumnClass方法,该方法获取列的单元格的数据类型。接下来,该表将该列的数据类型与为其注册单元格呈现器的数据类型列表进行比较。此列表由表初始化,但可以添加或更改。目前,表中列出了以下类型的数据:

  • 用复选框呈现布尔值。
  • 由右对齐标签呈现的数字。
  • 双,浮动-相同的数字,但是对象到文本的转换是由一个NumberFormat实例执行的(使用当前区域设置的默认数字格式)。
  • 日期-由标签呈现,由DateFormat实例执行对象到文本的转换(使用日期和时间的短样式)。
  • ImageIcon,图标-由居中的标签呈现.
  • 对象-由显示对象的字符串值的标签呈现。

要注意的事。如果没有覆盖getColumnClass(),则呈现程序将默认为Object,因此将呈现对象的toString()值,因此呈现javax.swing.ImageIcon...。作为上述状态中文本的前几行,该表将首先查找自定义呈现器。如果您指定了一个呈现器,那么它将使用这个呈现器。在这种情况下,getColumnClass()只用于从上面的列表中获取呈现器。但是,因为您已经指定了呈现器,所以您的getColumnClass()是无用的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23700756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档