2012-04-07 4 views
4

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

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

ответ

9

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

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

Редактировать
Вы спрашиваете:

Спасибо, это то, как я рисую firt изображение (дорога)

Опять же, вы можете создать 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(); 
     } 
     }); 
    } 
} 
+0

@DZkid: смотрите, пожалуйста, изменить, чтобы ответить. –

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); 
      } 
     }); 
    } 
} 
+0

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

+0

* «Я просто не могу найти способ нарисовать новый образ (изображение транспортного средства) над другим изображением (дорогой)». * Если это не должно быть «прошедшим временем», я не понимаю. Мой код делает именно то, что **, и я ожидаю, что это делает другой ответ. BTW - «автомобиль» не имеет «u». ;) –

+0

Я не мог и я не мог найти ... & для «транспортного средства» у него есть «и» по-французски, и я часто пишу по-французски ... я не имел в виду написать это так специально :) – DZkid

Смежные вопросы