imageicon和listcellrenderer的图像质量不佳

时间:2015-05-27 07:57:21

标签: java swing bufferedimage imageicon listcellrenderer

我需要实现一个图像列表,用户可以通过拖放来移动。 这就是我使用的代码:

    ...
    model = new DefaultListModel();
    imageList = new JList(model);
    imageList.getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    imageList.setTransferHandler(new ListItemTransferHandler());
    imageList.setDropMode(DropMode.INSERT);
    imageList.setDragEnabled(true);
    imageList.setLayoutOrientation(JList.HORIZONTAL_WRAP);
    imageList.setVisibleRowCount(1);
    imageList.setFixedCellWidth(405);
    imageList.setFixedCellHeight(height);
    imageList.setCellRenderer(new IconCellRenderer());

然后我将我的文件加载为BufferedImages并将它们添加到模型

我的IonCellRenderer类如下:

    class IconCellRenderer extends DefaultListCellRenderer {
    private static final long serialVersionUID = 1L;

    private int size1;
    private int size2;
    private int spostamento;
    private BufferedImage icon;

    IconCellRenderer() {
        this(400,600);
    }

    IconCellRenderer(int size1,int size2) {
        this.size1 = size1;
        this.size2 = size2;
        spostamento = 4;
        icon = new BufferedImage(size1,size2,BufferedImage.TYPE_INT_ARGB);
    }

    @Override
    public Component getListCellRendererComponent(
            JList list, 
            Object value, 
            int index, 
            boolean isSelected, 
            boolean cellHasFocus) {
        Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        if (c instanceof JLabel && value instanceof BufferedImage) {
            JLabel l = (JLabel)c;
            l.setText("");
            BufferedImage i = (BufferedImage)value;
            l.setIcon(new ImageIcon(icon));


            Graphics2D g = icon.createGraphics();
            g.setColor(new Color(0,0,0,0));
            g.clearRect(spostamento, 0, size1, size2);
            g.drawImage(i,spostamento,0,size1,size2,this);



            g.dispose();
        }
        return c;
    }

    @Override 
    public Dimension getPreferredSize() {
        return new Dimension(size1, size2);
    }
}

然而,当我运行代码时,它可以工作,但显示的图像质量很差,而且它们也没有显示某些行。 我不知道是否可能是因为图像的大小有点大(即1488x2105),我将它们的大小调整为400x600。

我该如何解决?

谢谢你的建议, Stefano Franchini

0 个答案:

没有答案