java - getTableCellRendererComponent 被反复调用并使 CPU 使用率达到 100%

标签 java swing jtable cpu-usage tablecellrenderer

我有一个 JTable 并且它的列之一应该显示图像; 我重写了 DefaultTableCellRenderergetTableCellRendererComponent 方法来执行此操作。 但问题是当图像不是 Null 并且单元格正在显示它时,此方法被反复调用(就像在无限循环中调用一样)并使用 100% CPU! (当图像为 Null 时没有问题!)。

问题是什么?

我的扩展类是:

public class imageCellRenderer extends DefaultTableCellRenderer{

    @Override
    public void validate() {}
    @Override
    public void revalidate() {}
    @Override
    protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {}
    @Override
    public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        if(isSelected) {
            this.setBackground(table.getSelectionBackground());
            this.setForeground(table.getSelectionForeground());
        }else {
            this.setBackground(table.getBackground());
            this.setForeground(table.getForeground());
        }
        this.setIcon(null);
        Image Scaled;
        ImageIcon tmp;
        System.out.println("CR");
        if(value != null){
            System.out.println("CRP");
            if(value instanceof ImageIcon){
                tmp=(ImageIcon)value;
            }else{
                tmp=new ImageIcon(value.toString());
            }
            int w=tmp.getIconWidth();
            int h=tmp.getIconHeight();
            int refW=100;
            int refH=100;
            double ratio=(double)w/(double)h;
            if(w!=refW && h!=refH){
                int nh,nw;
                double relx=(double)w/(double)refW;
                if(((double)h/relx)<refH){
                    nh = (int) Math.round(refW / ratio);
                    nw = refW;
                }else{
                    nw=(int)Math.round(refH*ratio);
                    nh=refH;
                }
                Scaled=tmp.getImage().getScaledInstance(nw, nh, Image.SCALE_SMOOTH);

                tmp=new ImageIcon(Scaled);
            }
            this.setIcon(tmp);
            table.setRowHeight(row, tmp.getIconHeight());

            this.setSize(100, tmp.getIconHeight());
            this.setHorizontalAlignment(JLabel.CENTER);
        }
        return this;
    }

}

我是这样使用它的:

jTable1.getColumnModel().getColumn(2).setCellRenderer(new imageCellRenderer());

最佳答案

删除

table.setRowHeight(row, tmp.getIconHeight());

来自渲染器的调用。此调用将调整再次触发渲染器的行高

关于java - getTableCellRendererComponent 被反复调用并使 CPU 使用率达到 100%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12880867/

相关文章:

java - 如何在应用 MaskFormatter 后使 JTable 单元格中的插入符显示在左侧

Java:如何将变量传递给具有接口(interface)参数类型的函数

java - 对于(嵌套)类来说,简单到什么程度算太简单?

java - 在Java中使用Future的最佳方法

java - 如何通过迭代具有数组值的 for 循环来填充 JTable

java - 如何从jtable中删除一行

java - 从接口(interface)访问单例的引用,可以吗?

java - mac osx 上 java7 模态对话框的焦点问题

Java Swing GridBagLayout JTextField 添加错误消息后更改大小

java - 尝试将一个类制作成二维数组