1

がありJTable、その列の 1 つに画像を表示する必要があります。getTableCellRendererComponentこれを行う方法をオーバーライドDefaultTableCellRendererしました。しかし、問題は、画像が表示されていない Nullときにセルが表示されているときに、このメソッドが何度も呼び出され (無限ループで呼び出されるように)、CPU を 100% 使用することです! (画像が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());
4

1 に答える 1

12

を取り外します

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

レンダラーから呼び出します。この呼び出しは、レンダラーを再度トリガーする行の高さを調整します

于 2012-10-14T09:49:44.760 に答える