Java Swing: 鼠标进入时更改球的颜色

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);
}

}

如果您运行此代码,它将按照之前提到的方式工作。但我不知道如何将Ball类定义为组件/JComponent,以便实现MouseEntered。

1个回答

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方法中包括,否则不会清除屏幕。

如果这样做无法解决问题,请告诉我。


不行,那并没有解决问题。当鼠标悬停在球上时,鼠标进入并没有改变球的颜色。 - SoluableNonagon
@Student01010101 然后您需要重新绘制球。在设置颜色后调用 draw() 函数。 - Ryan Amos
我调用repaint但没有任何反应。可能是因为球的构造函数只有一堆int作为参数。它实际上并不存在,而是使用draw()在屏幕上显示对象。 - SoluableNonagon
你需要将“draw”更改为“paint”,然后你的“repaint”调用就会起作用。 - Ryan Amos
@Student01010101,我忘记给你打标签了。 - Ryan Amos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接