Как нарисовать на JLabel с иконкой изображения в Java? - PullRequest
0 голосов
/ 18 апреля 2019

Как я могу нарисовать на 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 Ответ

1 голос
/ 18 апреля 2019

Если все, что вы хотите сделать, это нарисовать на значке, то используйте 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();
}

Итак, ответ на ваш вопрос, это зависит от того, чего вы хотите достичь ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...