Java 通过鼠标拖动移动椭圆E2D
如标题所示,我想用鼠标拖动椭圆。我首先声明了椭圆,并通过Java 通过鼠标拖动移动椭圆E2D,java,ellipse,Java,Ellipse,如标题所示,我想用鼠标拖动椭圆。我首先声明了椭圆,并通过ArrayLists绘制了它们(因为我有8个携带不同颜色信息的椭圆。四个是白色,另一个是红色)。我试着做我为矩形所做的: public void mousePressed(MouseEvent e) { x = e.getX(); y = e.getY(); } public void mouseDragged(MouseEvent e) { if(e.getSource()==MainPane) {
ArrayLists
绘制了它们(因为我有8个携带不同颜色信息的椭圆。四个是白色,另一个是红色)。我试着做我为矩形所做的:
public void mousePressed(MouseEvent e)
{
x = e.getX();
y = e.getY();
}
public void mouseDragged(MouseEvent e)
{
if(e.getSource()==MainPane)
{
int dx = e.getX() - x;
int dy = e.getY() - y;
Point p = getLocation();
if(el1.getBounds().contains(x,y))
{
el1.x += dx;
el1.y += dy;
}
x += dx;
y += dy;
}
}
但这似乎不起作用。这给了我一个错误
cannot find symbol
symbol: variable x
location: <ellipse name> of type Ellipse2D
因此,通过查看,很明显,
Ellipse2D
不会公开x
/y
属性
相反,您必须使用setFrame
方法之一
这个例子是对你的例子的一个小小的修改,它决定了当mousePressed
事件发生时应该移动哪个椭圆,因为在我看来,在mouseDragged
事件中这样做是没有意义的,除非你跳起来拾取所有椭圆。它还定义了“单击”点和椭圆位置之间的偏移,这样它们就不会“跳”到鼠标位置
import java.awt.Color;
import java.awt.Container;
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.event.MouseMotionListener;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Sample extends JFrame implements MouseListener, MouseMotionListener {
JPanel MainPane;
Container contentPane;
ArrayList<Ellipse2D> redEl = new ArrayList<Ellipse2D>();
ArrayList<Ellipse2D> whiteEl = new ArrayList<Ellipse2D>();
Ellipse2D el1 = new Ellipse2D.Double(120, 110, 50, 50);
Ellipse2D el2 = new Ellipse2D.Double(250, 110, 50, 50);
Ellipse2D el3 = new Ellipse2D.Double(390, 110, 50, 50);
Ellipse2D el4 = new Ellipse2D.Double(540, 110, 50, 50);
Ellipse2D el5 = new Ellipse2D.Double(120, 390, 50, 50);
Ellipse2D el6 = new Ellipse2D.Double(250, 390, 50, 50);
Ellipse2D el7 = new Ellipse2D.Double(390, 390, 50, 50);
Ellipse2D el8 = new Ellipse2D.Double(540, 390, 50, 50);
int x;
int y;
private Point2D.Double offSet;
public Sample() {
redEl.add(el1);
redEl.add(el2);
redEl.add(el3);
redEl.add(el4);
whiteEl.add(el5);
whiteEl.add(el6);
whiteEl.add(el7);
whiteEl.add(el8);
MainPane = new JPanel() {
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
for (Shape red : redEl) {
g2.setColor(Color.RED);
g2.fill(red);
g2.draw(red);
}
for (Shape white : whiteEl) {
g2.setColor(Color.WHITE);
g2.fill(white);
g2.draw(white);
}
}
};
MainPane.setBackground(Color.BLACK);
contentPane = this.getContentPane();
contentPane.add(MainPane);
MainPane.setLayout(null);
setVisible(true);
setSize(701, 701);
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MainPane.addMouseListener(this);
MainPane.addMouseMotionListener(this);
}
private Ellipse2D selected = null;
public void mousePressed(MouseEvent e) {
x = e.getX();
y = e.getY();
List<Ellipse2D> all = new ArrayList<>(redEl);
all.addAll(whiteEl);
for (Ellipse2D el : all) {
if (el.contains(x, y)) {
selected = el;
offSet = new Point2D.Double(x - el.getX(), y - el.getY());
break;
}
}
}
public void mouseClicked(MouseEvent e) {
selected = null;
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
if (selected != null) {
double x = e.getX() - offSet.x;
double y = e.getY() - offSet.y;
Rectangle2D bounds = selected.getBounds2D();
bounds.setFrame(new Rectangle2D.Double(x, y, bounds.getWidth(), bounds.getHeight()));
selected.setFrame(bounds);
repaint();
}
}
public void mouseMoved(MouseEvent e) {
}
public static void main(String args[]) {
new Sample();
}
}
导入java.awt.Color;
导入java.awt.Container;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Shape;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.awt.event.MouseMotionListener;
导入java.awt.geom.Ellipse2D;
导入java.awt.geom.Point2D;
导入java.awt.geom.Rectangle2D;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类示例扩展JFrame实现MouseListener、MouseMotionListener{
JPanel主窗格;
容器内容窗格;
ArrayList redEl=新的ArrayList();
ArrayList Whitel=新的ArrayList();
Ellipse2D el1=新的Ellipse2D.Double(120,110,50,50);
Ellipse2D el2=新的Ellipse2D.Double(250,110,50,50);
Ellipse2D el3=新的Ellipse2D.Double(390、110、50、50);
Ellipse2D el4=新的Ellipse2D.Double(540,110,50,50);
Ellipse2D el5=新的Ellipse2D.Double(12039050);
Ellipse2D el6=新的Ellipse2D.Double(250,390,50,50);
Ellipse2D el7=新的Ellipse2D.Double(39039039050);
Ellipse2D el8=新的Ellipse2D.双精度(540,390,50,50);
int x;
int-y;
专用点2D。双偏移量;
公共样本(){
redEl.add(el1);
redEl.add(el2);
redEl.add(el3);
redEl.add(el4);
添加(el5);
添加(el6);
添加(el7);
添加(el8);
MainPane=newjpanel(){
公共组件(图形g){
超级组件(g);
图形2d g2=(图形2d)g;
用于(形状红色:红色){
g2.设置颜色(颜色为红色);
g2.填充(红色);
g2.绘制(红色);
}
用于(形状白色:白色){
g2.设置颜色(颜色为白色);
g2.填充(白色);
g2.绘制(白色);
}
}
};
主窗格。背景(颜色。黑色);
contentPane=this.getContentPane();
contentPane.add(主窗格);
MainPane.setLayout(空);
setVisible(真);
设置大小(701701);
可设置大小(假);
setLocationRelativeTo(空);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MainPane.addMouseListener(此);
MainPane.addMouseMotionListener(此);
}
所选的专用Ellipse2D=null;
公共无效鼠标按下(MouseEvent e){
x=e.getX();
y=e.getY();
List all=新阵列列表(redEl);
all.addAll(怀特尔);
for(省略号2d el:all){
if(el.包含(x,y)){
所选=el;
偏移量=新的点2d.Double(x-el.getX(),y-el.getY());
打破
}
}
}
公共无效mouseClicked(MouseEvent e){
选中=空;
}
公共无效MouseEvent(MouseEvent e){
}
公共无效鼠标事件(鼠标事件e){
}
公共无效mouseExited(MouseEvent e){
}
公共无效鼠标标记(鼠标事件e){
如果(已选择!=null){
double x=e.getX()-offSet.x;
双y=e.getY()-offSet.y;
矩形2D边界=选定。getBounds2D();
setFrame(新的矩形2D.Double(x,y,bounds.getWidth(),bounds.getHeight());
selected.setFrame(边界);
重新油漆();
}
}
public void mouseMoved(MouseEvent e){
}
公共静态void main(字符串参数[]){
新样本();
}
}
Ellipse2D
实际上并不公开x
/y
属性。你可以使用setFrame
代替。谢谢:)我会尝试使用那种有效的方法!!非常感谢:)
public void mouseDragged(MouseEvent e)
{
if(e.getSource()==MainPane)
{
int dx = e.getX() - x;
int dy = e.getY() - y;
Point p = getLocation();
if(el1.getBounds().contains(x,y))
{
double xc = el1.getX();
double yc = el1.getY();
el1.setFrame(xc+=dx, yc+=dy, 50, 50);
MainPane.repaint();
}
x += dx;
y += dy;
}
}
import java.awt.Color;
import java.awt.Container;
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.event.MouseMotionListener;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Sample extends JFrame implements MouseListener, MouseMotionListener {
JPanel MainPane;
Container contentPane;
ArrayList<Ellipse2D> redEl = new ArrayList<Ellipse2D>();
ArrayList<Ellipse2D> whiteEl = new ArrayList<Ellipse2D>();
Ellipse2D el1 = new Ellipse2D.Double(120, 110, 50, 50);
Ellipse2D el2 = new Ellipse2D.Double(250, 110, 50, 50);
Ellipse2D el3 = new Ellipse2D.Double(390, 110, 50, 50);
Ellipse2D el4 = new Ellipse2D.Double(540, 110, 50, 50);
Ellipse2D el5 = new Ellipse2D.Double(120, 390, 50, 50);
Ellipse2D el6 = new Ellipse2D.Double(250, 390, 50, 50);
Ellipse2D el7 = new Ellipse2D.Double(390, 390, 50, 50);
Ellipse2D el8 = new Ellipse2D.Double(540, 390, 50, 50);
int x;
int y;
private Point2D.Double offSet;
public Sample() {
redEl.add(el1);
redEl.add(el2);
redEl.add(el3);
redEl.add(el4);
whiteEl.add(el5);
whiteEl.add(el6);
whiteEl.add(el7);
whiteEl.add(el8);
MainPane = new JPanel() {
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
for (Shape red : redEl) {
g2.setColor(Color.RED);
g2.fill(red);
g2.draw(red);
}
for (Shape white : whiteEl) {
g2.setColor(Color.WHITE);
g2.fill(white);
g2.draw(white);
}
}
};
MainPane.setBackground(Color.BLACK);
contentPane = this.getContentPane();
contentPane.add(MainPane);
MainPane.setLayout(null);
setVisible(true);
setSize(701, 701);
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MainPane.addMouseListener(this);
MainPane.addMouseMotionListener(this);
}
private Ellipse2D selected = null;
public void mousePressed(MouseEvent e) {
x = e.getX();
y = e.getY();
List<Ellipse2D> all = new ArrayList<>(redEl);
all.addAll(whiteEl);
for (Ellipse2D el : all) {
if (el.contains(x, y)) {
selected = el;
offSet = new Point2D.Double(x - el.getX(), y - el.getY());
break;
}
}
}
public void mouseClicked(MouseEvent e) {
selected = null;
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
if (selected != null) {
double x = e.getX() - offSet.x;
double y = e.getY() - offSet.y;
Rectangle2D bounds = selected.getBounds2D();
bounds.setFrame(new Rectangle2D.Double(x, y, bounds.getWidth(), bounds.getHeight()));
selected.setFrame(bounds);
repaint();
}
}
public void mouseMoved(MouseEvent e) {
}
public static void main(String args[]) {
new Sample();
}
}