Java Swing: изменение цвета шара на mouseEntered

Я уже могу создать шар на панели в MousePressed и MouseReleased, обновить координаты с помощью MotionListener и изменить цвет шара, когда мышь находится над ним. Это прекрасно работает в классе myPanel, потому что панель имеет определенные размеры и мышь работает внутри нее. Но что я должен сделать сейчас, и я не уверен, как заставить класс Ball расширить Component и реализовать MouseListener. И с этим я должен использовать MouseEntered в классе Ball, чтобы изменить цвет шара. Помогите?

//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

1 ответ

Решение

Использование 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 метод.

Скажи мне, если это не исправит это.

Другие вопросы по тегам