gpt4 book ai didi

java - 如何单击并拖动某些内容而不取消选择

转载 作者:行者123 更新时间:2023-12-01 11:00:10 25 4
gpt4 key购买 nike

该程序是一个在屏幕上创建汽车和/或卡车图标的动画。我现在的方式无法正常工作。具体来说,该程序没有单击并向右拖动。如果某个对象未被选中,则单击后,该对象会变粗以表明该对象已被选中。从那里我们希望能够拖动它,无论鼠标走到哪里,程序都会重新绘制图像。如果未选择图像,当我单击并拖动它时,它工作正常。我遇到的问题是图像是否已被选择。如果图像已被选择,当我将鼠标移到它上面并单击它以将其移动到不同位置时,它不会移动,而是会被取消选择,因此不会发生移动。以下是 mousePressed 和 mouseDragged 事件的代码。我认为这就是问题所在,但我不确定是什么原因造成的。

addMouseListener(new
MouseAdapter()
{
public void mousePressed(MouseEvent event)
{
mousePoint = event.getPoint();
for (SceneShape s : shapes)
{
if (s.contains(mousePoint))
s.setSelected(!s.isSelected());
}
repaint();
}
});

addMouseMotionListener(new
MouseMotionAdapter()
{
public void mouseDragged(MouseEvent event)
{
Point lastMousePoint = mousePoint;
mousePoint = event.getPoint();
for (SceneShape s : shapes)
{
if (s.isSelected())
{
double dx
= mousePoint.getX() - lastMousePoint.getX();
double dy
= mousePoint.getY() - lastMousePoint.getY();
s.translate((int) dx, (int) dy);
}
}
repaint();
}
});

有人可以帮我解释一下,当我拖动而不是移动它时,导致程序取消选择已选择的图像的原因以及如何解决此问题?谢谢。

最佳答案

拖动操作的副作用之一是 mouseClicked不会被调用。为什么这很重要?基本上,您可以使用这个事实来决定是否应该在 mouseClicked 范围内取消选择某个对象。事件而不是类似 mousePressed 的事件或mouseReleased .

它确实要求您维护一些有关当前和先前状态的信息,以便您知道该对象是刚刚被选择还是先前被选择,但基本思想效果很好。

Drag me

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class WhatADrag {

public static void main(String[] args) {
new WhatADrag();
}

public WhatADrag() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class TestPane extends JPanel {

private List<Rectangle> boxes;
private Rectangle selected;

public TestPane() {
boxes = new ArrayList<>(25);
int x = 0;
int y = 0;
for (int index = 0; index < 10; index++) {
boxes.add(new Rectangle(x, y, 100, 100));
x += 25;
y += 25;
}

MouseAdapter ma = new MouseAdapter() {

private Rectangle previous;
private Point delta;

@Override
public void mousePressed(MouseEvent e) {
List<Rectangle> reversed = new ArrayList<>(boxes);
Collections.reverse(reversed);
previous = selected;
if (selected == null || !selected.contains(e.getPoint())) {
for (Rectangle box : reversed) {
if (box.contains(e.getPoint())) {
selected = box;
delta = new Point(e.getX() - selected.x, e.getY() - selected.y);
repaint();
break;
}
}
if (selected != null) {
boxes.remove(selected);
boxes.add(boxes.size() - 1, selected);
}
} else if (selected != null) {
delta = new Point(e.getX() - selected.x, e.getY() - selected.y);
}
}

@Override
public void mouseClicked(MouseEvent e) {
if (selected == previous && selected != null && selected.contains(e.getPoint())) {
selected = null;
repaint();
}
}

@Override
public void mouseDragged(MouseEvent e) {
if (selected != null) {
int x = e.getX() - delta.x;
int y = e.getY() - delta.y;
selected.x = x;
selected.y = y;
repaint();
}
}

};

addMouseListener(ma);
addMouseMotionListener(ma);
}

@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}

protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
for (Rectangle box : boxes) {
if (box != selected) {
g2d.setColor(Color.BLUE);
g2d.fill(box);
g2d.setColor(Color.BLACK);
g2d.draw(box);
}
}
if (selected != null) {
g2d.setColor(Color.CYAN);
g2d.fill(selected);
g2d.setColor(Color.BLUE);
g2d.draw(selected);
}
g2d.dispose();
}

}

}

I am just so lost. I am looking at all this code and don't even understand what it is doing.

是的,我对我的代码有很多这样的感觉。

基本上...

第一: mousePressed被调用,我反转我的对象列表,因为最上面的组件将是列表中的最后一个(这是我的要求),我将当前选定的对象存储在 previous 中变量,我用它来确定选择是否发生变化。我检查用户是否单击了 selected不管他们反对与否,如果他们反对,我们基本上可以跳过其他所有事情。如果没有,我们会确定他们点击了什么(如果有的话)。 delta只是他们点击的位置和对象位置之间的差异,这用于使拖动更加自然

如果没有发生拖动: mouseClicked叫做。我们测试一下 selected 是否对象等于 previous对象,并且如果在 selected 内单击鼠标对象,如果这些是 true ,那么当前的selected应取消选择对象。否则,用户基本上只是更改了选择,因此我们不想立即取消选择它。

否则,如果发生拖动: mouseDragged叫做。我们简单地检查一下是否有 selected ,我们计算当前鼠标位置和“点击偏移”之间的差值并更新 selected 的位置对象

清澈如泥:P

还需要记住的一件事是 mouseReleased总是在 mousePressed 之后调用,即使mouseClicked不是(当没有发生拖动时在 mouseReleased 之后调用)。

关于java - 如何单击并拖动某些内容而不取消选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33402446/

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