2012-05-10 8 views
2

ファイルパスからJFrame上の特定の位置に画像を表示するJFrameを作成しようとしています。後で(ボタンがクリックされたとき)、画像を左に50ピクセル移動させます。レイアウトマネージャが必要な場合は、これは自分用のプロジェクトであるため、nullレイアウトを使用したいと思います。自分のレイアウトマネージャを書く方法を学ぶ準備がまだ整っていません。JFrameで画像を手動で配置

これまでは、フレーム内にBufferedImageを表示することができましたが、その位置を指定する方法はわかりません。

正しいアプローチであってもBufferedImageを使用していますか?これを行う最善の方法は何ですか?

アップデート:私はのMouseListenerを使用してのご提案を追跡しようとしましたが、それがこのの結果:

class ImgComponent extends JComponent implements ChangeListener, MouseListener { 

MovableImage mi; 

public ImgComponent(MovableImage mi) { 
    this.mi = mi; 
    mi.addListener(this); 
     mi.addListener1(this); 
} 

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.drawImage(mi.i, mi.getX(), mi.getY(), null); 
} 

@Override 
public void stateChanged(ChangeEvent e) { 
    repaint(); 

} 
@Override 
public void mouseClicked(MouseEvent e) { 
     mi.setPos(100, 100); 
     System.out.println("yay"); 
} 

}

しかしunfortinely、のmouseClickedイベントがトリガされません。私はちょうどその地獄のイメージが動いてほしい、笑。

答えて

3

ここでは、モデル/ビュー/コントローラパターンを使用した完全な例を示します。 (1つだけ.javaファイルにお互いの後に、すべてのスニペットをダンプします。)

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.util.*; 
import java.util.List; 

import javax.swing.*; 
import javax.swing.event.*; 


// A class encapsulating an image and a x-coordinate (a "model") 
class MovableImage { 
    Image i = new ImageIcon("duke.png").getImage(); 
    private int x = 0; 

    // Observers that are interested in movements. 
    List<ChangeListener> listeners = new ArrayList<ChangeListener>(); 

    public void addListener(ChangeListener cl) { 
     listeners.add(cl); 
    } 

    public int getX() { 
     return x; 
    } 

    public void incrementX() { 
     x += 10; 

     // Notify those interested. 
     for (ChangeListener cl : listeners) 
      cl.stateChanged(null); 
    } 
} 

 

// A graphical component displaying the model. 
// Object of this class are interested in movement because when the image moves, 
// this component needs to be repainted. 
class ImgComponent extends JComponent implements ChangeListener { 

    // The movable image to present. 
    MovableImage mi; 

    public ImgComponent(MovableImage mi) { 
     this.mi = mi; 
     mi.addListener(this); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(mi.i, mi.getX(), 10, null); 
    } 

    // This method is called from MovableImage when the position changes. 
    @Override 
    public void stateChanged(ChangeEvent e) { 
     repaint(); 
    } 
} 

 

// Main class. 
public class FrameTestBase extends JFrame { 

    public static void main(String args[]) { 

     // Create the "model". 
     final MovableImage mi = new MovableImage(); 

     FrameTestBase t = new FrameTestBase(); 
     t.setLayout(new BorderLayout()); 

     // Add a component presenting the model. 
     t.add(new ImgComponent(mi), BorderLayout.CENTER); 

     // Create a button which increments x when clicked on. 
     t.add(new JButton(new AbstractAction("Move right") { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       mi.incrementX(); 
      } 
     }), BorderLayout.SOUTH); 

     // Show it. 
     t.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     t.setSize(400, 400); 
     t.setVisible(true); 
    } 
} 

enter image description here


あなたの編集に関して:

あなたはに加えて、マウスリスナーを追加する必要があります。コンストラクタで:

public ImgComponent(MovableImage mi) { 
    this.mi = mi; 
    mi.addListener(this); 
    mi.addListener1(this); 
} 

は、一番下に次の行を追加します。

addMouseListener(this); 
+0

おかげでたくさん!あなたがそれを壊してコメントを追加する前は、混乱していました。それらはとても役に立ちました。質問のみ:画像にリスナーを追加することは可能ですか?その場合、画像自体をクリックすると移動しますか? – user1386318

+0

はい、可能です;-)マウスリスナーをImgComponentに追加し、クリックに応じて反応させることをお勧めします。 – aioobe

+0

ありがとうございました。 :D – user1386318