Вопрос по swing, java – Как нарисовать изображение поверх другого изображения?

4

У меня есть проект Java, посвященный моделированию сети трафика в случайном городе. Мне удалось найти способ реализации этого проекта, поэтому я разделил каждое пересечение на раздел, который в основном представляет собой расширенный класс JPanel (названный Carrefour). ... все работает хорошо, пока я не застрял в том, как рисовать транспортные средства и заставлять их проезжать через дороги.

Итак, моя проблема в том, как нарисовать изображение (изображение транспортного средства) поверх другого изображения (дороги)?

Ваш Ответ

2   ответа
11

Другой подход, который не требует расширения компонентов.

enter image description here

import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import java.util.Random;
import java.net.URL;
import javax.imageio.ImageIO;

public class ImageOnImage {

    ImageOnImage(final BufferedImage bg, BufferedImage fg) {
        final BufferedImage scaled = new BufferedImage(
            fg.getWidth()/2,fg.getHeight()/2,BufferedImage.TYPE_INT_RGB);
        Graphics g = scaled.getGraphics();
        g.drawImage(fg,0,0,scaled.getWidth(),scaled.getHeight(),null);
        g.dispose();

        final int xMax = bg.getWidth()-scaled.getWidth();
        final int yMax = bg.getHeight()-scaled.getHeight();

        final JLabel label = new JLabel(new ImageIcon(bg));

        ActionListener listener = new ActionListener() {

            Random random = new Random();

            public void actionPerformed(ActionEvent ae) {
                Graphics g = bg.getGraphics();
                int x = random.nextInt(xMax);
                int y = random.nextInt(yMax);

                g.drawImage( scaled, x, y, null );
                g.dispose();

                label.repaint();
            }
        };

        Timer timer = new Timer(1200, listener);
        timer.start();

        JOptionPane.showMessageDialog(null, label);
    }

    public static void main(String[] args) throws Exception {
        URL url1 = new URL("http://i.stack.imgur.com/lxthA.jpg");
        final BufferedImage image1 = ImageIO.read(url1);

        URL url2 = new URL("http://i.stack.imgur.com/OVOg3.jpg");
        final BufferedImage image2 = ImageIO.read(url2);

        //Create the frame on the event dispatching thread
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                new ImageOnImage(image2, image1);
            }
        });
    }
}
Я не мог & amp; т & amp; Я все еще не могу найти ... & amp; для "транспортного средства"; у него есть «u»; на французском Я часто писал по-французски ... поэтому я не хотел писать это так нарочно :) DZkid
не могли бы вы взглянуть на код, который я предоставил выше (мой первый пост) & amp; скажи мне, почему это не работает. & Амп; заранее спасибо. DZkid
"I just can't find a way to draw a new image (vehicule image) over an another image (road)."  Если не предполагается, что это «прошедшее время»; Я не понимаю. Мой код делаетexactly that, & Амп; Я ожидаю, что так же, как и другой ответ. Кстати - «автомобиль» не имеет "u". ;)
спасибо ... но я не ищу новую концепцию для моего проекта ... я все это сделал ... я просто не могу найти способ нарисовать новое изображение (изображение транспортного средства) поверх другого изображения (дороги) , DZkid
Вы знаете, я не имею в виду грубость или что-то в этом роде ... Но я все прояснил & amp; даже предоставил код, который я использовал для реализации своего приложения (он находится в самом верху этой страницы), просто проверьте мой первый пост ... & amp; Я также хотел показать изображение, отображающее результат моего приложения, но эта система сайта сказала, что я не могу. + & amp; Я так далек от того, чтобы найти время, чтобы поиграть в игру с 20 вопросами ... Я просто попытался сделать ее короткой. DZkid
9

Если это Swing, тогда нарисуйте фоновое изображение в BufferedImage. Отобразить это изображение BufferedImage в методе paintComponent JComponent (например, в JPanel) с использованием GraphicdrawImage(...) метод, а затем нарисуйте изменяющиеся изображения поверх этого в том же методе paintComponent. Не забудьте позвонитьsuper.paintComponent(...) Сначала метод хотя.

Обратите внимание, что этот вопрос задавался довольно часто здесь и в других местах, и, как и следовало ожидать, есть много примеров такого рода вещей, которые вы можете найти здесь с небольшим поиском.

Edit
Ты спрашиваешь:

Thanks, this is how I draw the firt image (road)

Опять же, вы бы создали BufferedImage для этого, вероятно, используяImageIO.read(...), Затем вы нарисуете это в своих JPanel'ах.paintComponent(Graphics g) переопределение метода с использованиемg.drawImage(...).

Например...

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.*;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.*;

@SuppressWarnings("serial")
public class IntersectionImagePanel extends JPanel {
   private static final String INTERSECTION_LINK = "http://www.weinerlawoffice.com/" +
        "accident-diagram.jpg";
   private BufferedImage intersectionImage;

   public IntersectionImagePanel() {
      URL imageUrl;
      try {
         imageUrl = new URL(INTERSECTION_LINK);
         intersectionImage = ImageIO.read(imageUrl );
      } catch (MalformedURLException e) {
         e.printStackTrace();
         System.exit(-1);
      } catch (IOException e) {
         e.printStackTrace();
         System.exit(-1);
      }
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      if (intersectionImage != null) {
         g.drawImage(intersectionImage, 0, 0, this);
      }
   }

   @Override
   public Dimension getPreferredSize() {
      if (intersectionImage != null) {
         int width = intersectionImage.getWidth();
         int height = intersectionImage.getHeight();
         return new Dimension(width , height );
      }
      return super.getPreferredSize();
   }

   private static void createAndShowGui() {
      IntersectionImagePanel mainPanel = new IntersectionImagePanel();

      JFrame frame = new JFrame("IntersectionImage");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
@DZkid: пожалуйста, смотрите редактировать, чтобы ответить.

Похожие вопросы