gpt4 book ai didi

java - 如何在特定形状上实现 mouselistener?

转载 作者:行者123 更新时间:2023-11-30 06:18:46 25 4
gpt4 key购买 nike

我在 java 中使用 swing 创建了一个圆形 strip ,现在我想在鼠标单击 strip 的特定区域(例如 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");
}
}

//}

}

最佳答案

不要扩展 JFrame,也不要覆盖 paint。相反,您应该扩展 JPanel 并覆盖 paintComponent。此外,您应该在事件调度线程上创建 GUI。

关于实际问题:对此有不同的可能解决方案。在任何情况下,您都必须实现 MouseListener 接口(interface)。并且在鼠标点击之后,你必须检查鼠标位置是否包含在相应的区域中。您可以通过比较坐标和计算角度来手动执行此操作,但这可能很麻烦。创建用相应颜色填充的 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) {
}
}

关于java - 如何在特定形状上实现 mouselistener?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24034747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com