2014-07-18 46 views
1

我想教自己的Java和我已經被難倒了。我今天練習得太多了,或者我只是有一個愚蠢的時刻。我將如何將MotionListener分離到不同的類中?

我正在玩塗料和MouseMotionListener,以便能夠在屏幕上拖動圖形,並且我想讓MouseMotionListener成爲一個單獨的類。

上的問題:

我怎麼會聽衆在我的代碼分離到一個單獨的類?當我試圖把它放在另一個班級時,我只是做了一個循環引用。

代碼:

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionListener; 

import javax.swing.JFrame; 


@SuppressWarnings("serial") 
class Class1 extends JFrame implements MouseMotionListener{ 

Point p,p2; 


public Class1(){ 
    p = new Point(0,0); 
    this.setSize(500,500); 
    //this.setUndecorated(true); 
    //this.setBackground(new Color(0.0f, 0.0f, 0.0f, 0.01f)); 
    this.addMouseMotionListener(this); 
    this.setLocationRelativeTo(null); 
    this.setVisible(true); 
    this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
} 

public static void main(String[]args){ 
    new Class1(); 
} 

public void paint(Graphics g){ 
    g.setColor(Color.gray); 
    g.fillRect(0, 0, 500, 500); 
} 

public void paintSquare(Graphics g){ 
    g.fillRect(p.x, p.y, 50, 50); 
} 

public void paintCover(Graphics g){ 
    g.setColor(Color.gray); 
    g.fillRect(p2.x, p2.y, 50, 50); 
} 

@Override 
public void mouseDragged(MouseEvent e) { 
    p2=p; 
    p=e.getPoint(); 
    p.translate(-25, -25); 
    paintCover(this.getGraphics()); 
    paintSquare(this.getGraphics()); 
} 

@Override 
public void mouseMoved(MouseEvent e) { 
    //do nothing 
} 

} 
+1

你** **(在許多情況下,比如你的)有一個循環引用:框架將「知道」監聽器實例,並且監聽器實例可能有一個參考返回到框架。但是,在任何情況下:不要**在組件上調用'getGraphics()'!這樣繪畫顯然是錯誤的**。例如,請參閱http://docs.oracle.com/javase/tutorial/uiswing/painting/獲取簡介。 – Marco13

+1

看看[執行自定義繪畫](http://docs.oracle.com/javase/tutorial/uiswing/painting/),看看應該如何完成繪畫... – MadProgrammer

+0

謝謝你們的資源。確切地說,我需要閱讀。 – Orion

回答

2

開始是你的邏輯中分離到的責任範圍...

您需要:

  • 東西來渲染輸出
  • 的東西,以保持輸出的當前狀態
  • 什麼來改變輸出的當前狀態

讓我們先從模型...

的模型維護關於輸出當前狀態的信息,它提供了一種方法,通過該方法可以更改狀態,並可以生成通知以告知感興趣的奇偶校驗狀態已更改。

視圖負責呈現模型的狀態,並偵聽更改模型的狀態,這樣當模型改變它可以自行更新...

MouseMotionListener(在這種情況下)將用於修改模型的狀態...

該視圖和MouseMotionListener都將引用該模型,這樣,該模型將充當各個組件之間的橋樑。 MouseMotionListener將用於更新模型,模型會觸發通知到視圖,該視圖將繪製模型的當前狀態。

查看model-view-controller瞭解更多詳情。

此外,Swing中的自定義繪畫通常通過覆蓋從JComponent延伸的類的paintComponent方法來完成。您應該避免覆蓋頂級容器JFrame或使用getGraphicspaint。看看Performing Custom Painting瞭解更多詳情

+0

你解釋得很好。非常感謝 – Orion

+0

這是一個有點抽象,但點擊要點。你會發現,如果你使用正確的繪畫過程,你只需要突出顯示「當前」單元格,先前突出顯示的單元格將自動處理;) – MadProgrammer

0

MouseMotionListener是一個界面看到here。您可以有效地將其從Class1實施中「移除」的唯一方法是將其移至abstract類,請參閱here或創建一些處理所需邏輯的對象。

您可以使抽象類實現MouseMotionListener並覆蓋MouseMotionListener中定義的所需方法,並處理所述抽象類中的邏輯。然後你會用你所說的Class1與抽象類extend

請注意,你不要使它成爲一個抽象類。你也可以有某種MouseMotionHandler類的,可以做同樣的,你會創建它,並把它添加到JFrame像這樣:

public class MouseMotionHandler implements MouseMotionListener { 
    @Override 
    public void mouseDragged(MouseEvent e) { 
     // do something here 
    } 

    @Override 
    public void mouseMoved(MouseEvent e) { 
     //do something here 
    } 
} 

而在你JFrame

MouseMotionHandler mmh = new MouseMotionHandler(); 
this.addMouseMotionListener(mmh); 

另一件事你可以看看是MouseAdapterhttp://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseAdapter.html

這裏有一些參考:

http://docs.oracle.com/javase/tutorial/java/concepts/interface.html http://www.javaworld.com/article/2077421/learn-java/abstract-classes-vs-interfaces.html http://www.tutorialspoint.com/java/java_object_classes.htm http://docs.oracle.com/javase/tutorial/java/javaOO/

+0

所以你剛剛描述了MouseAdapter ... – MadProgrammer

+0

我想,除了OP講述的**之外,只有** ** MoustMotionListener – Mister

+0

是的,你所寫的內容在技術上是正確的,正確地制定和格式化信息和鏈接和這樣的 - 但它*似乎*不是針對問題的核心,哪(** IF **我正確理解這一點)是你提出的'MouseMotionHandler'需要一個對它所屬的'Class1'實例的引用「循環參考」)。正如在其他評論中提到的那樣,這實際上不是問題...... – Marco13

相關問題