2014-07-18 6 views
1

나는 자바 자신을 가르치려고 노력하고있다. 나는 오늘 너무 많이 연습했거나 그냥 바보 같은 순간을 보내고있다.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

** 많은 경우에서 귀하의 것과 같은 순환 참조가 있습니다. 프레임은 수신기 인스턴스를 "알"며, 수신기 인스턴스는 참조를 다시 가질 수 있습니다 프레임에. 그러나 어쨌든 : ** Component에서! getGraphics()를 호출하지 마라! 이 방법으로 그림을 그리는 것은 명백하게 ** 잘못된 ** 일입니다. 예를 들어, http://docs.oracle.com/javase/tutorial/uiswing/painting/을 참조하십시오. – Marco13

+1

[페인팅 수행] (http://docs.oracle.com/javase/tutorial/uiswing/painting/)에서 회화 작업을 수행하는 방법을 확인하십시오. – MadProgrammer

+0

두 자원 모두에게 감사드립니다. 정확히 내가 읽을 필요가 있었던 것. – Orion

답변

2

시작 책임의 영역으로 로직을 분리 할 수 ​​: 여기 http://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseAdapter.html

는 일부 참조입니다

  • 뭔가 ...

가의 모델로 시작하자 출력의 현재 상태를 변경하는

  • 뭔가 출력의 현재 상태를 유지하기 위해 출력을
  • 뭔가를 렌더링

    모델은 출력의 현재 상태에 대한 정보를 유지 관리하며 상태를 변경할 수있는 수단을 제공하며 관심있는 패리티에 상태가 변경되었음을 알리는 알림을 생성 할 수 있습니다.

    뷰 (이 경우)가

    MouseMotionListener

    것 ... 모델의 상태를 렌더링 모델이 변경 될 때 그 자체를 업데이트 할 수 있도록 모델의 상태에 대한 변경 사항을 청취 할 책임이 모델의 상태를 수정하는 데 사용됩니다 ...

    보기와 보기는 모두 모델에 대한 참조를 가지므로이 모델은 다양한 구성 요소 사이의 다리 역할을합니다. MouseMotionListener은 모델을 업데이트하는 데 사용되며 모델은 모델의 현재 상태를 그리는 뷰에 대한 알림을 트리거합니다.

    자세한 내용은 model-view-controller을 참조하십시오.

    또한 Swing의 사용자 정의 페인트는 paintComponent 클래스를 JComponent까지 확장하여 대체합니다. JFrame과 같은 최상위 컨테이너 인 paint을 무시하거나 getGraphics을 사용하지 않아야합니다. 자세한 내용은 Performing Custom Painting을 참조하십시오.

  • +0

    당신은 그렇게 잘 설명했습니다. 대단히 감사합니다. – Orion

    +0

    조금 추상적이지만 중요한 요점에 부딪 힙니다. 올바른 그림 프로세스를 사용하면 "현재"셀만 강조 표시하고 이전에 강조 표시된 셀은 자동으로 처리됩니다. – MadProgrammer

    0

    MouseMotionListener는 인터페이스가 here을 볼 수 있습니다. Class1 구현에서 효과적으로 제거 할 수있는 유일한 방법은 abstract 클래스로 이동하는 것입니다 (here 참조). 또는 필요한 로직을 처리하는 개체를 만듭니다.

    MouseMotionListener을 추상 클래스로 구현하고 MouseMotionListener에 정의 된 필수 메소드를 대체하고 해당 추상 클래스의 논리를 처리 할 수 ​​있습니다. 그럼 당신은 extend 귀하의 Class1 것이라고 말했다 추상 클래스.

    이없는 것은 추상 클래스가되도록주의하십시오. 또한 동일한 기능을 수행 할 수 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); 
    

    또 다른 일에 보십시오 MouseAdapter입니다.

    당신이 필요로 ...

    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

    일종의 얘기입니다 ** 제외 ** MoustMotionListener에 대한 이야기 ​​** – Mister

    +0

    네가 쓴 것은 기술적으로 정확하고 infos 및 링크로 적절히 공식화하고 형식화 한 것입니다. (* IF **는 이것을 올바르게 이해했다.) 당신이 제안한'MouseMotionHandler'가 그것이 속한'Class1' 인스턴스에 대한 참조를 필요로 할 것인가하는 질문의 핵심을 목표로하지 않는 것 같습니다. "순환 참조"). 다른 의견에서 언급했듯이 이것은 실제로 문제가되지 않습니다 ... – Marco13