2012-02-22 164 views
4

改变球的颜色我已经可以创造的mousePressed上和和的mouseReleased更新面板的球MotionListener坐标和改变球的颜色,当鼠标移动到它。 这可以在myPanel类中正常工作,因为面板已经定义了尺寸,并且鼠标在里面工作。 但我现在要做的,我不知道如何使球类扩展组件和实现MouseListener。因此,我必须在Ball类中使用MouseEntered来更改球的颜色。 帮助?的Java Swing:上的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); 
} 

} 

所以,如果你运行的代码,它的工作原理如前面提到的,但我不知道如何界定Ball类为Component/JComponent的,以便它在实施的mouseEntered

回答

4

使用addMouseListener(this)您的构造函数:

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 2012-02-22 23:13:05

+0

@ Student01010101然后,您需要重新绘制球。在设置颜色后调用draw()。 – 2012-02-22 23:19:30

+0

我打电话重漆,没有任何反应。也许是因为球构造函数只有一串int作为参数。它并不存在,但使用draw()来显示屏幕上的对象。 – SoluableNonagon 2012-02-22 23:49:14