Пользовательский значок JLabel

Я хочу использовать java JLabel со значком нестандартного размера в своем графическом интерфейсе. нравится :

http://i.stack.imgur.com/XVglU.png

Я использовал этот код для изменения размера исходного значка:

    ImageIcon imageIcon = (ImageIcon) jLabel1.getIcon();// new ImageIcon( "Play-Hot-icon.png");

    ImageIcon thumbnailIcon = new ImageIcon(getScaledImage(imageIcon.getImage(), 25 , 25));
    jLabel1.setIcon(thumbnailIcon);

и вот код для изменения размера изображения

private Image getScaledImage(Image srcImg, int w, int h){

    BufferedImage resizedImg = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    Graphics2D g2 = resizedImg.createGraphics();

    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

    g2.drawImage(srcImg, 0, 0, w, h, null);

    g2.dispose();
    return resizedImg;
}    

но после изменения размера изображения и использования этого кода результат такой! :

введите здесь описание изображения

как я могу иметь желаемое изображение на моем JLabel ??

С уважением, Саджад


person sajad    schedule 31.01.2011    source источник
comment
Есть ли причина не использовать Image.getScaledInstance для масштабирования изображения?   -  person Zach L    schedule 31.01.2011
comment
Так что спасибо тебе ! эти маленькие слова решили проблему!   -  person sajad    schedule 31.01.2011
comment
Если вы не возражаете, я спрошу. Я много использовал Java и изучал создание пользовательских компонентов, но какие части и части должны быть в пользовательском JComponent для правильного кодирования. Я много чего читал, но в этой теме, кажется, много разных ответов. Если бы я хотел начать с нуля и создать JLabel и добавить к нему свои собственные свойства, как бы я это сделал?   -  person    schedule 05.05.2014


Ответы (1)


Проблема в том, что когда вы создаете масштабированное изображение, вы используете BufferedImage.TYPE_INT_RGB для своего нового изображения, а прозрачность становится черной с помощью всего лишь TYPE_INT_RGB.

Чтобы сохранить прозрачность, вам нужно заменить это на BufferedImage.TYPE_INT_ARGB, так как вам нужен альфа-компонент.

Однако вызов Image.getScaledInstance на изображении imageIcon вернет масштабированное изображение уже с альфа-компонентом, и вы можете передать ему подсказки рендеринга, чтобы поиграть с качеством масштабированного изображения, делая по существу то же самое, что и ваш getScaledImage функция, но с меньшим количеством хлопот.

person Zach L    schedule 31.01.2011