如何在Java中使用带有图像图标的JLabel进行绘制?

时间:2019-04-17 21:49:49

标签: java swing

如何在带有图标的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);
    }

}



1 个答案:

答案 0 :(得分:1)

如果只想绘制图标,则使用BufferedImage,例如...

Simple

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

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();
}

因此,您问题的答案是,这取决于您要实现的目标...