首页 > 解决方案 > 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);
    }
}

标签: javaswing

解决方案


如果您只想在图标上绘图,请使用 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();
}

所以,你的问题的答案是,这取决于你想要实现什么......


推荐阅读