Напечатайте на JLabel квадрат и сохраните его в изображении, которое является содержимым JLabel - PullRequest
0 голосов
/ 03 мая 2019

Мне нужно показать пользователю изображение и привести его к выделению мышью области. Поэтому я создаю и показываю JFrame, в который помещаю JLabel, инициализированный с помощью ImageIcon. После того, как я добавлю и переопределю mouseEventListner на JLabel. Мой рабочий план состоял в том, чтобы получить первый и второй щелчок мыши, чтобы получить точки родственников для использования в качестве краев, чтобы идентифицировать выбранную область. Я правильно получаю очки. Но я не могу правильно заменить предыдущий JLabel на новый с закрашенным прямоугольником.

Важно сохранить информацию о выбранной области на изображении (на его пикселе), показанном в JFrame, потому что во второй момент мне нужно управлять этой информацией на уровне пикселей.

Так вот, где я инициализировал JFrame:

 JFrame frame = new JFrame();
                ImageIcon icon = new ImageIcon(imgPath);
                JLabel label = new JLabel(icon);
                frame.add(label);
                frame.setTitle(imgPath.substring(imgPath.lastIndexOf("\\")+1));
                frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
                frame.pack();
                frame.setVisible(true);
                frame.setResizable(false); 

                //function to select area by mouse click
                addHandlerToDraw(label,frame,icon);

Это функция, которую я называю:

private void addHandlerToDraw(JLabel label, JFrame frame, ImageIcon img) {

    label.addMouseListener(new MouseAdapter() {

        Point start = new Point();
        Rectangle captureRect;
        int k=0;
        @Override
        public void mouseClicked(java.awt.event.MouseEvent e) {
            if(k==0) {
                start = e.getPoint();
                k=1;
            } else {
                k = 0;
                Point end = e.getPoint();
                captureRect = new Rectangle(start, new Dimension(end.x-start.x, end.y-start.y));
            }
            repaint(captureRect, frame, img, label);
            label.repaint();
        }
    });

И, наконец, это функция, благодаря которой я хочу переключить предыдущее изображение (без выделенной области) с изображением с выбранной областью, показанным:

private void repaint(Rectangle rect, JFrame frame, ImageIcon img, JLabel label) {

    BufferedImage bi = new BufferedImage(
            img.getIconWidth(),
            img.getIconHeight(),
            BufferedImage.TYPE_INT_RGB);

    Graphics2D g1 = bi.createGraphics();
    g1.setColor(new Color(200,30,30,45));
    if(rect != null) {
        g1.drawRect(rect.x, rect.y, rect.width, rect.height);
        frame.remove(label);
        frame.add(new JLabel(new ImageIcon(bi)));
        frame.setVisible(true);
    }}

Как я уже делал раньше, даже если я правильно вычислю прямоугольник, я не смогу сохранить и показать его в новом JLabel и т. Д. В JFrame. Где я не прав?

...