4

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

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

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

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

    от DZkid
  • не могли бы вы взглянуть на код, который я предоставил выше (мой первый пост) & amp; скажи мне, почему это не работает. & Амп; заранее спасибо.

    от DZkid
  • Вы знаете, я не имею в виду грубость или что-то в этом роде ... Но я все прояснил & amp; даже предоставил код, который я использовал для реализации своего приложения (он находится в самом верху этой страницы), просто проверьте мой первый пост ... & amp; Я также хотел показать изображение, отображающее результат моего приложения, но эта система сайта сказала, что я не могу. + & amp; Я так далек от того, чтобы найти время, чтобы поиграть в игру с 20 вопросами ... Я просто попытался сделать ее короткой.

    от DZkid
  • @DZkid: пожалуйста, смотрите редактировать, чтобы ответить.

    от
  • Я не мог & amp; т & amp; Я все еще не могу найти ... & amp; для "транспортного средства"; у него есть «u»; на французском Я часто писал по-французски ... поэтому я не хотел писать это так нарочно :)

    от DZkid
  • "I just can't find a way to draw a new image (vehicule image) over an another image (road)."  Если не предполагается, что это «прошедшее время»; Я не понимаю. Мой код делаетexactly that, & Амп; Я ожидаю, что так же, как и другой ответ. Кстати - «автомобиль» не имеет "u". ;)

    от
  • 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);
                }
            });
        }
    }
    

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