Как определить Java-компонент, чтобы он работал с MouseListener - PullRequest
2 голосов
/ 22 февраля 2012

У меня есть класс Ball, который я хочу расширить JComponent и реализовать mouseListener.

public class Ball extends JComponent implements MouseListener {
    Int x, y, radius;

    public Ball(int X, int Y, int Radius){
        //contains only three ints and redefines x,y,radius
        x=X;
        y=Y;
        radius=Radius;
    }

    public void draw(Graphics g){
        //draw oval using x,y,radius
    }

    //5 mouselisteners undefined yet
}

Таким образом, ball - это конструктор, который используется панелью, находящейся внутри рамки.

Извините, я еще не ввел весь код. Я скоро отправлю свой полный код.

Так что мне нужно было бы использовать слушатель MouseEntered в классе ball, чтобы при входе мыши в компонент (ball / oval). Но я не знаю, как определить компонент, чтобы он знал, что он был введен. Нужны ли какие-то размеры? Потому что все, что я делаю, это использую функцию рисования на панели.

Ответы [ 4 ]

3 голосов
/ 22 февраля 2012

Если бы это был мой класс, я бы не стал расширять JComponent и не предоставил бы ему MouseListener или MouseMotionListener, особенно если бы я хотел отобразить несколько шариков в одном JComponent.Вместо этого я бы дал ему открытые методы, позволяющие другим классам получить свои границы (например, доступные из интерфейса Shape), и то, содержится ли что-то в форме или нет (опять-таки интерфейс Shape работает хорошо для этого), и другие публичныеметоды, которые позволяют внешним классам изменять состояние (внешний вид?) этого объекта.

Я бы тогда имел JComponent, удерживающий один Ball или ArrayList<Ball>, и в MouseListener / MouseMotionListener / MouseAdapter для этого JComponent,переберите ArrayList<Ball>, чтобы увидеть, находится ли мышь внутри какого-либо шара, и, если это так, измените состояние этого шара.Затем в методе paintComponent JComponent я повторял бы ArrayList<Ball>, вызывая draw(g) для каждого содержащегося шара.

1 голос
/ 22 февраля 2012

Вам следует позвонить

this.addMouseListener(new MouseAdapter() {
    ....
});

в конструкторе. Переопределите mouseEntered() и mouseExited() внутри адаптера.

0 голосов
/ 22 февраля 2012

Помимо замечаний, уже высказанных Hovercraft Full Of Eels, я думаю, что вы путаете понятие быть слушателем и добавлять слушателя к чему-либо.

Не путем реализации MouseListener эти методы будут вызываться. Слушатель - это заинтересованная сторона, и вы добавляете ее к объекту, который вас интересует. Таким образом, в этом случае вы хотите добавить MouseListener к вашему классу Ball, который полностью отличается от того, чтобы позволить вашему классу Ball реализовать MouseListener.

Более подробную информацию можно найти в Википедия: Шаблон наблюдателя или более простой и более ориентированный на Swing документ можно найти в Swing tutorials

0 голосов
/ 22 февраля 2012

Я бы предпочел, чтобы вы реализовали весь MouseListener.Вполне возможно, что позже вы захотите получить больше от своего Ball-компонента, например, чтобы он двигался, если вы нажимаете на него или что-то еще.Если вы реализуете интерфейс, вы будете применять его для последующих изменений.

import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JComponent;

public class Ball extends JComponent implements MouseListener {
    int x, y, radius;

    public Ball(int x, int y, int radius){
    //contains only three ints and redefines x,y,radius
    this.x= x;
    this.y= y;
    this.radius= radius;
}

public void draw(Graphics g){
    //draw oval using x,y,radius
}

@Override
public void mouseClicked(MouseEvent arg0) {


}

@Override
public void mouseEntered(MouseEvent arg0) {
    //your code to do things, when the mouse entered your ball          
}

@Override
public void mouseExited(MouseEvent arg0) {


}

@Override
public void mousePressed(MouseEvent arg0) {


}

@Override
public void mouseReleased(MouseEvent arg0) {


}

}

...