Как реализовать MouseListener на конкретной фигуре?

1

Я создал круговую полосу с использованием swing в java, и теперь я хочу отобразить текст при щелчке мышью по конкретному участку полосы, например, между 45 градусами и 135 градусами по центральному углу, может кто-нибудь мне помочь?

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Ellipse2D;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Test extends JFrame implements MouseListener
{
//public static final int MOUSE_CLICKED;

public static void main(String[] args)
{
    new Test();
}
public Test()
{
    this.setSize(400,400);
    this.setVisible(true);

    addMouseListener(this);
}

public void paint(Graphics g)
{
    g.fillArc(50,50,230,270,45,90);
    g.setColor(Color.red);
     double radius1 = 230;
     double theta=90;
    double a1 = (Math.PI * radius1 * radius1*theta)/360;
    System.out.println("area"+a1);
     double radius2 = 200;

    double a2 = (Math.PI * radius2 * radius2*theta)/360;
    System.out.println("area2"+a2);
    double a=a1-a2;
     System.out.println("fin area"+a);

    g.fillArc(50,50,230,270,135,90);
    g.setColor(Color.blue);

    g.fillArc(50,50,230,270,225,90);
    g.setColor(Color.yellow);

    g.fillArc(50,50,230,270,315,90);
    g.setColor(Color.magenta);

    Graphics2D comp2D=(Graphics2D)g;
    comp2D.setColor(Color.white);
    Ellipse2D.Float sign=new Ellipse2D.Float(90F,90F,150F,200F);
    comp2D.fill(sign);

    {
        //System.out.println("hello");
    }
}

//}

}
  • 1
    Поместите mouseListener в компонент и проверьте координаты щелчка, которые идут в аргументе MouseEvent.
Теги:
swing
mouselistener
paint

1 ответ

5

Не расширяйте JFrame и не переопределяйте paint. Вместо этого вы должны расширить JPanel и переопределить paintComponent. Кроме того, вы должны создать графический интерфейс в Thread Dispatch Thread.

Что касается актуального вопроса: для этого существуют разные возможные решения. В любом случае вам придется реализовать интерфейс MouseListener. И после щелчка мыши вы должны проверить, содержится ли позиция мыши в соответствующем регионе. Вы могли бы это сделать вручную, сравнив координаты и вычислительные углы, но это может быть хлопот. Должно быть намного проще создавать объекты Shape которые вы заполняете соответствующими цветами, а затем просто проверить, содержит ли какая-либо фигура положение мыши.

Этот подход примерно очерчен здесь, хотя я не воспроизвел ваши точные фигуры. (Возможно, вам придется создавать их с помощью класса Area и его методов для объединения и пересечения).

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Arc2D;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ShapeClickTest {


    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(new ShapeClickTestPanel());
        f.setSize(400, 400);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

}

class ShapeClickTestPanel extends JPanel implements MouseListener {
    private final List<Shape> shapes;
    private final List<Color> colors;

    public ShapeClickTestPanel() {
        addMouseListener(this);

        shapes = new ArrayList<Shape>();
        colors = new ArrayList<Color>();

        shapes.add(new Arc2D.Double(50, 50, 230, 270, 45, 90, Arc2D.OPEN));
        colors.add(Color.RED);

    }

    @Override
    protected void paintComponent(Graphics gr) {
        super.paintComponent(gr);
        Graphics2D g = (Graphics2D) gr;

        for (int i = 0; i < shapes.size(); i++) {
            Shape shape = shapes.get(i);
            Color color = colors.get(i);
            g.setColor(color);
            g.fill(shape);
        }
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        for (int i = 0; i < shapes.size(); i++) {
            Shape shape = shapes.get(i);
            if (shape.contains(e.getPoint())) {
                System.out.println("Clicked shape " + i);
            }
        }
    }

    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню