如何在带有图标的JLabel上绘图?在我的代码中,椭圆形替换了图像,只有椭圆形和画布,没有图像。我想在图像上绘画。我该怎么办?
public void go() {
String IMAGE_PATH = "start_phone.jpg";
URL imgUrl = getClass().getResource(IMAGE_PATH);
JFrame frame = new JFrame();
JPanel panel = new JPanel();
MyLabel imageLabel = new MyLabel();
ImageIcon icon = new ImageIcon(getClass().getResource(IMAGE_PATH));
imageLabel.setIcon(icon);
imageLabel.add(panel);
frame.add(imageLabel);
frame.setSize(1200, 1200);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
}
class MyLabel extends JLabel
{
public void paintComponent(Graphics g)
{
g.setColor(Color.green);
g.fillOval(100,100,100,100);
}
}
答案 0 :(得分:1)
如果只想绘制图标,则使用BufferedImage
,例如...
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();
}
}
然后简单地使用它...
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();
}
因此,您问题的答案是,这取决于您要实现的目标...