Если все, что вы хотите сделать, это нарисовать на значке, то используйте BufferedImage
, например ...
![Simple](https://i.stack.imgur.com/cVpwS.png)
try {
BufferedImage phone = ImageIO.read(Main.class.getResource("/test/phone.png"));
Graphics2D g2d = phone.createGraphics();
g2d.setColor(Color.RED);
g2d.fillOval(phone.getWidth() - 17, 0, 16, 16);
g2d.dispose();
JLabel label = new JLabel("Phone");
label.setIcon(new ImageIcon(phone));
JOptionPane.showMessageDialog(null, label);
} catch (IOException ex) {
ex.printStackTrace();
}
В своем коде вы можете либо загрузить изображение непосредственно как BufferedImage
, как в примере выше, либо загрузить его как ImageIcon
и нарисовать его на новом BufferedImage
, в зависимости от ваших потребностей
Если вместо этого вы хотите нарисовать на этикетке, ну, это более сложно. Помните, что JLabel
- это сложный компонент с иконкой, текстом и логикой размещения. Проблема всего этого в том, что вы не можете получить доступ к информации, используемой для разметки отдельных элементов.
Главное, позвоните super.paintComponent
. Это на самом деле картина иконы и текста ...
public static class ExampleLabel extends JLabel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(Color.RED);
g2d.fillOval(getWidth() - 17, 0, 16, 16);
g2d.dispose();
}
}
, а затем просто используйте его ...
![Complicated](https://i.stack.imgur.com/RAu6f.png)
try {
BufferedImage phone = ImageIO.read(Main.class.getResource("/test/phone.png"));
JLabel label = new ExampleLabel();
label.setText("Phone");
label.setIcon(new ImageIcon(phone));
JOptionPane.showMessageDialog(null, label);
} catch (IOException ex) {
ex.printStackTrace();
}
Итак, ответ на ваш вопрос, это зависит от того, чего вы хотите достичь ...