java - java - 如何在Java中使用图像图标在JLabel上绘制?
问题描述
如何在带有图标的 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);
}
}
解决方案
如果您只想在图标上绘图,请使用 a 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();
}
在您的代码中,您可以像上面的示例一样直接将图像加载为 a BufferedImage
,或者将其加载为 aImageIcon
并将其绘制到 newBufferedImage
上,具体取决于您的需要
相反,如果您想在标签上绘画,那会更复杂。请记住,aJLabel
是一个复杂的组件,具有图标、文本和放置逻辑。所有这一切的问题是,您无法访问用于布局单个元素的信息。
重要的是,打电话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();
}
所以,你的问题的答案是,这取决于你想要实现什么......
推荐阅读
- c# - 在特定方法调用上生成警告(.net 二进制类库)
- devops-services - 使用 Azure 数据工厂的 DevOPS
- c# - SignalR 客户端-服务器通信 WPF
- d3.js - 如何在 vue-cli 中创建 d3 svg?
- php - PHP 三元:内联 if 语句
- asp.net - 面临使用 filehelper.dll 导出 CSV 的问题
- python - Flask - 获取点击的链接信息并显示在渲染页面上
- html - 加速移动页面 (AMP) -HTML
- java - 如何在 java8 中定义没有 args 的函数或返回值?
- vhdl - Lattice Fpga 内部时钟