2012-02-22 2 views
4

MousePressed 및 MouseReleased의 패널에 공을 만들고 MotionListener로 좌표를 업데이트하고 마우스가 위에있을 때 공의 색상을 변경할 수 있습니다. 패널에 치수가 정의되어 있고 마우스가 내부에서 작동하기 때문에이 값은 myPanel 클래스에서 올바르게 작동합니다. 하지만 지금해야 할 일은 Ball 클래스가 Component를 확장하고 MouseListener를 구현하는 방법을 잘 모르는 것입니다. Ball 클래스에서 MouseEntered를 사용하여 볼의 색상을 변경해야합니다. 도움 말 하시겠습니까? 코드를 실행하면자바 스윙 : 마우스에서 공의 색상 변경하기 예 :

//Ball 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Ball extends JComponent implements MouseListener{ 

public int x,y,r; 
public Color c = Color.BLUE; 
private int distance = 0; 

public Ball(int X, int Y, int R){ 
    super(); 
    x=X; 
    y=Y; 
    r=R; 
addMouseListener(this); 
} 

public void draw(Graphics g){ 
    g.setColor(c); 
    g.fillOval(x-r, y-r, 2*r, 2*r); 
} 

public void mousePressed(MouseEvent me){} 
public void mouseReleased(MouseEvent me){ } 
public void mouseClicked(MouseEvent me){} 
public void mouseEntered(MouseEvent me){ 
c = Color.ORANGE; 
} 
public void mouseExited(MouseEvent me){} 

} 


//myPanel 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.event.MouseInputAdapter; 

public class myPanel extends JPanel implements MouseListener{ 

private Color c = new Color(150,200,100); 
public Ball ball = new Ball(100,100,50); 
private Point mouseCoords = new Point(); 

public myPanel(){ 
    super(); 
    setLayout(new FlowLayout()); 
    addMouseListener(this); 
    add(ball); 
} 


public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    ball.draw(g); 
} 

public void mousePressed(MouseEvent me){ 
    ball.x = me.getX(); 
    ball.y = me.getY(); 
    labelPanel.setX(me.getX()); //Report x and y values 
    labelPanel.setY(me.getY()); 
// ball.c = Color.RED;   //change color on click 
    repaint(); 
} 
public void mouseReleased(MouseEvent me){} 
public void mouseMoved(MouseEvent me) {} 
public void mouseClicked(MouseEvent me){} 
public void mouseEntered(MouseEvent me){} 
public void mouseExited(MouseEvent me){} 

} 

// myFrame 
import java.awt.*; 
import javax.swing.*; 

public class myFrame extends JFrame{ 

public myPanel left = new myPanel(); 
public labelPanel right = new labelPanel(); 

public myFrame(){ 

    super("This is my Frame"); 
    setLayout(new BorderLayout()); 
    setSize(900,700); 
    add(left,BorderLayout.CENTER); 
    add(right,BorderLayout.EAST); 
    setVisible(true); 
} 

public static void main(String[] args){ 
    myFrame mF = new myFrame(); 
    mF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 

} 


//labelPanel 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.event.MouseInputAdapter; 



public class labelPanel extends JPanel{ 

public static JLabel xCoord = new JLabel("X=",JLabel.RIGHT); 
public static JLabel yCoord = new JLabel("Y=",JLabel.RIGHT); 
public Color c = new Color(100,200,10); 

public labelPanel() { 
    super(); 
    setBackground(c); 
    setLayout(new GridLayout(2,1)); 
    add(xCoord); 
    add(yCoord); 
} 

public static void setX(int x){ 
    xCoord.setText("X=" + x); 
} 
public static void setY(int y){ 
    yCoord.setText("Y=" + y); 
} 

} 

그래서, 그것은 앞서 언급 한 작품,하지만 난 그것을에서의 mouseEntered

답변

4

사용 addMouseListener(this)을 구현하는 것이 있도록 구성 요소/JComponent의로 볼 클래스를 정의하는 방법을 모른다 귀하의 생성자 :

public Ball(int X, int Y, int R){ 
    super(); 
    x=X; 
    y=Y; 
    r=R; 
    addMouseListener(this); 
} 

그리고 draw() 메서드에서 제거하십시오.

또한 paint(Graphics g)을 재정의하는 것이 좋습니다. 이것은 Swing이 언제 그릴 지 결정할 수있게 해줍니다. 언제든지 수동으로 repaint();을 호출하거나 paint()으로 전화하여 언제 그릴 수 있는지 수동으로 선택할 수 있습니다. repaint()은이 구성 요소와 모든 하위 구성 요소를 칠하고 구성 요소를 지 웁니다. paint()은 하위 구성 요소가 아닌이 구성 요소를 칠하기 만하고 paint 메서드에 포함되어 있지 않으면 화면을 지우지 않습니다.

해결되지 않는 경우 알려주십시오.

+0

아니요. 그것은 그것을 고치지 않았다. 마우스가 공 위에있을 때 입력 된 마우스는 공의 색상을 변경하지 않습니다. – SoluableNonagon

+0

@ Student01010101 그런 다음 공을 다시 채색해야합니다. 색상을 설정 한 후에 draw()를 호출하십시오. –

+0

내가 다시 칠해도 아무 것도 일어나지 않습니다. 어쩌면 볼 생성자는 매개 변수로 int의 무리만을 가지고 있기 때문일 것입니다. 실제로는 존재하지 않지만 draw()를 사용하여 화면 상에 객체를 표시합니다. – SoluableNonagon