2012-04-07 15 views
4

私はランダムな都市で交通ネットワークシミュレーションに関するJavaプロジェクトを持っています。私はこのプロジェクトを実装する方法を理解することができました。したがって、各交差点を基本的に拡張されたJPanelクラス(カルフール) ...私は車を引っ張って道路を通過させる方法につきものになるまでうまくいっています。別のイメージにイメージを描画する方法は?

私の問題は、画像(車の画像)を別の画像(道路)に描画する方法です。

答えて

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

ありがとうございます。しかし、私は私のプロジェクトに新しい概念を求めていません。私はすべて完了しました。私は別のイメージ(道路)上に新しいイメージ(Vehiculeイメージ)を描画する方法を見つけることができません。 )。 – DZkid

+0

*「別の画像(道路)に新しい画像(Vehicule画像)を描画する方法が見つからない」*「過去時制」でない限り、私は理解しません。私のコードは**まさにそうです**と私はそう思います。 BTW - '車両'には 'u'がありません。 ;) –

+0

私は見つけることができませんでした...&vehièreのためにフランス語で 'u'を持っています&私はフランス語でたくさん書いていました。目的の通りに書いてください:) – DZkid

関連する問題