Перекрывающиеся изображения с помощью setIcon

Я сделал JLabel, где я отображаю свои изображения следующим образом:

BufferedImage myimage;
imageLabel.setIcon(new ImageIcon(myimage));

Можно ли нарисовать изображение и нарисовать на нем изображение меньшего размера (значок) с помощью команды setIcon? Как мне это сделать?

Например:

BufferedImage myimage1;
BufferedImage myLittleIcon;
imageLabel.setIcon(new ImageIcon(myimage1));
imageLabel.setIcon(new ImageIcon(myLittleIcon));

Приведенное выше просто рисует маленькую иконку.


person george mano    schedule 02.12.2012    source источник
comment
Вы предоставили код для JLabel, но пометили его и назвали как JFrame — что это?   -  person wchargin    schedule 02.12.2012


Ответы (1)


Вызов setIcon приведет к перезаписи значка. Однако вы можете попробовать что-то вроде этого:

// Assumed that these are non-null
BufferedImage bigIcon, smallIcon;

// Create a new image.
BufferedImage finalIcon = new BufferedImage(
    bigIcon.getWidth(), bigIcon.getHeight(),
    BufferedImage.TYPE_INT_ARGB)); // start transparent

// Get the graphics object. This is like the canvas you draw on.
Graphics g = finalIcon.getGraphics();

// Now we draw the images.
g.drawImage(bigIcon, 0, 0, null); // start at (0, 0)
g.drawImage(smallIcon, 10, 10, null); // start at (10, 10)

// Once we're done drawing on the Graphics object, we should
// call dispose() on it to free up memory.
g.dispose();

// Finally, convert to ImageIcon and apply.
imageLabel.setIcon(new ImageIcon(finalIcon));

Это создает новое изображение, рисует большой значок, а затем рисует маленький значок.

Вы также можете рисовать другие элементы, например выделение прямоугольника или заполнение овала .

Для более продвинутых графических функций попробуйте выполнить приведение к Graphics2D объект.

person wchargin    schedule 02.12.2012
comment
1) Не забудьте dispose() экземпляра графики. 2) Пожалуйста, дайте ссылку на документы последней общедоступной JRE, а не на документы из 1.4.2. 3) Ре. ваш запрос между JLabel и JFrame я решил, поскольку имя атрибута кода подразумевает метку, пометить его как таковое. - person Andrew Thompson; 02.12.2012
comment
Почему вы рисуете от 0,0 до 10,10? - person george mano; 02.12.2012
comment
Это был просто пример. Он нарисует большое изображение с верхним левым углом в точке (0, 0), а маленькое изображение с верхним левым углом в точке (10, 10). Это не имеет отношения к размеру. Если вы не укажете размер, будет использоваться размер изображения. Если вы хотите масштабировать его, например, начиная с (10, 15) с шириной 30 и высотой 40, вы должны использовать drawImage(image, 10, 15, 30, 40, null). - person wchargin; 03.12.2012