2012-04-07 3 views
4

임의의 도시에서 트래픽 네트워크 시뮬레이션에 대한 Java 프로젝트가 있으므로이 프로젝트를 구현하는 방법을 알아 냈습니다. 그래서 각 교차점을 기본적으로 확장 된 JPanel 클래스 인 까르푸 (Cartre) ... 나는 차량을 끌고 길을 통과하는 방법에 매달릴 때까지 모든 것이 잘 작동합니다.다른 이미지 위에 이미지를 그리는 방법은 무엇입니까?

내 문제는 어떻게 다른 이미지 (도로) 위에 이미지 (차량 이미지)를 그리는 것입니까?

답변

9

Swing의 경우, 백그라운드 이미지를 BufferedImage에 묘화합니다. 이 BufferedImage를, Graphic의 drawImage(...) 메서드를 사용해 JComponent (JPanel의) paintComponent 메소드에 표시해, 변경된 이미지를 같은 paintComponent 메소드로 묘화합니다. 먼저 super.paintComponent(...) 메서드를 호출하는 것을 잊지 마십시오.

이 질문은 여기 또는 다른 곳에서 많이 물어 보았습니다. 예상했던대로이 검색에는 약간의 검색을 통해 찾을 수있는 많은 예제가 있습니다.

편집이
당신은 질문 :

덕분에,이 내가

다시 (도로)을 firt 이미지를 그리는 방법, 당신은 사용하여 가능성이에 대한 BufferedImage를 만들 것 ImageIO.read(...). 그런 다음 g.drawImage(...)을 사용하여 JPanel의 paintComponent(Graphics g) 메서드 재정의에서이를 그립니다. 예를 들어

...

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

나는 찾을 수 없다. & "vehicule"을 위해 그것은 프랑스어로 'u'를 가지고있다. 그리고 나는 프랑스어로 많이 쓰는 데 익숙하다. 나는 의미하지 않았다. 의도적으로 그걸 쓰려면 :) – DZkid

관련 문제