2012-02-22 8 views
4

上のボールの色を変更すると、私はすでにのmousePressedとのmouseReleasedと更新のパネルでボールMotionListenerと協調を作成し、マウスが上にあるときにボールの色を変更することができます。 パネルに寸法が定義されていて、マウスがその内部で動作するため、これはmyPanelクラスで正常に機能します。 しかし、私は今何をしなければならず、BallクラスがComponentを拡張してMouseListenerを実装する方法がわからない。ボールの色を変更するには、BallクラスのMouseEnteredを使用する必要があります。 ヘルプ?Javaのスイング:の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

私はrepaintを呼び出し、何も起こりません。多分ボールコンストラクタはパラメータとしてintの束しか持っていないからかもしれません。実際には存在しませんが、draw()を使用してオブジェクトを画面に表示します。 – SoluableNonagon