因此,正如标题所述,我想在鼠标拖动时移动椭圆。我先声明了椭圆并将其画出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.Double存在这样的变量。
这是一个MCVE:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Ellipse2D;
import java.awt.geom.AffineTransform;
import java.util.ArrayList;
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;
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);
}
public void mousePressed(MouseEvent e)
{
x = e.getX();
y = e.getY();
}
public void mouseClicked(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseDragged(MouseEvent e)
{
if(e.getSource() == MainPane)
{
int dx = e.getX() - x;
int dy = e.getY() - y;
if(el1.getBounds().contains(x,y))
{
}
x += dx;
y += dy;
}
}
public void mouseMoved(MouseEvent e){}
public static void main(String args[])
{
new Sample();
}
}
那么是否有替代算法,或者我只是在语法上缺少什么?我想知道解决方案。谢谢。
更新:
通过MadProgrammer的建议解决了
这是我的mouseDragged
方法。
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;
}
}
因此,通过浏览JavaDocs
forEllipse2D
很显然,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();
}
}
任务是将物理光标移动到元素。 尝试以下操作: 和以下内容:
问题内容: 我在JLabel中有一个图像。 我想要以下功能。 -我单击JLabel内部的位置(在图像上)。 -按下鼠标按钮,即可更改JLabel中图像的位置。(我将图片拖到JLabel中的不同位置) 好吧,这意味着在许多情况下,图片将被裁剪并且在视野之外。 请告诉我如何实现此功能? 什么是要添加到我的JLabel的正确事件监听器? 问题答案: 这是一个基本的例子… 通过将标签划分为3x3网格来工作
有没有一种方法可以单击svg中的任何位置,并将元素捕捉到该位置,同时开始拖动? 我得到的最接近的是下面的代码。拖动圆可以工作,单击其他位置可以使圆移动到该位置,但我不知道如何在不释放鼠标并直接单击圆的情况下开始拖动。 更一般地说,如何在不直接与被拖动元素交互的情况下启动拖动行为? http://jsfiddle.net/Hj44M/1/
我是 GraphStream 的新手,并且已经构建了一个最小的应用程序,其中 GraphStream 2.0 图形嵌入到 Swing 应用程序中。 在我的应用程序中,当我尝试拖动节点时,鼠标指针显然偏移了大约一半的面板大小(垂直和水平)。 这是代码: 下图显示了在中心拖动矩形节点时的鼠标指针位置(以红色包围)。 关于这个问题的原因有什么想法吗? 编辑: 下面是一个简短的GIF动画,显示了问题(显示
因此,目前在伪代码中,我有: 我取代了dragbutton类中的鼠标运动/按压/释放功能。因此,我不能在那里引用新的。因此,dragbutton类中的无法获得,因为它是不同的self。我有什么办法让它起作用吗?谢了。
我在JavaFX中创建了一个小的绘画程序,并且有了一个圆形创建工具。目前,我可以正确地画圆,但与我的其他工具不同,我看不到正在创建的圆(即,当我拖动鼠标时)。只有当我松开鼠标时,我才能看到圆(以正确的尺寸绘制)。我试图在拖动时添加一个< code>strokeOval()方法,但是它创建了一个奇怪的“泪珠”状的圆。我什么都试过了,有人能帮忙吗? 这是我的代码: 上面的代码正确创建了圆,但在我释放鼠