2012-05-10 14 views
2

我想創建一個JFrame,它顯示從文件路徑到JFrame上特定位置的圖像。稍後(點擊一個按鈕時),我希望圖像移動位置,例如向左移動50個像素。如果佈局管理器是必要的,我想使用空佈局,因爲這是我自己的項目,我還沒有準備好學習如何編寫我自己的佈局管理器。在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

下面是使用模型/視圖/控制器模式的完整示例。 (只是轉儲後,對方所有的片斷在一個單一的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


關於你的編輯:

你需要add鼠標監聽器。在構造函數中:

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

在底部添加以下行:

addMouseListener(this); 
+0

非常感謝!在分手並添加評論之前,這有點令人困惑。這些非常有幫助。只有問題:是否可以添加監聽器到圖片上,所以如果你點擊圖片本身,它會移動? – user1386318

+0

是的,這是可能的;-)我建議你添加一個鼠標監聽器到ImgComponent並對點擊作出相應的反應。 – aioobe

+0

非常感謝您的幫助。 :D – user1386318