我有两个问题要问你:
[已解决] - 在java中,我可以使用鼠标侦听器移动图像。如果我单击并向上移动鼠标,它只是将图像向上移动,而不是将图像精确地移动到指针所在的位置。不要让图像跳转到我的鼠标指针所在的位置。
[求助] - 由于我正在构建一个编辑器,如果我在窗口上有多个可以移动的图像,如果有两个重叠的图像,我该如何检测我应该移动哪个图像。如果我想移动图像后面而不是前面的一个,反之亦然。你们在这里做的最好的方法是什么。
与这两个问题相关的一些代码
addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseMoved(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseDragged(MouseEvent arg0) {
// TODO Auto-generated method stub
//use this
if(curObj != null){
Point p = arg0.getPoint();
curObj.pos.x = p.x;
curObj.pos.y = p.y;
......
}
}
});
addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
//right now find the first one that contains the mouse.
//later we can make it so they have an option to pick on that overlaps.
Point p = arg0.getPoint();
SwingUtilities.convertPoint(Main.gui, p, instance);
....
//this is the code to detect which image to use
curObj = null;
for(int i = 0; i < objects.size(); i++){
StepObject obj = objects.get(i);
if(obj.isDraggable()){
if(p.x >= obj.pos.x && p.y >= obj.pos.y &&
p.x <= (obj.pos.x + obj.getWidth()) && p.y <= (obj.pos.y + obj.getHeight())){
curObj = obj;
break;
}
}
}
.....
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
}
});
感谢任何反馈。
感谢。
答案 0 :(得分:3)
我实际上是使用
Graphics
来绘制图像。
这是一个用户界面问题,可以追溯到最早的,广泛可用的object drawing programs。常见的方法是实现两个基本操作,使用户能够通过更改其呈现顺序来显示隐藏对象:
通常包括两个互补的操作:
GraphPanel
说明了几种在Java 2D中进行命中测试和处理多项选择的技巧。它说明了一个更简单的情况,其中至少某些对象是可见的。它的渲染顺序由一个使用List<Node>
的简单ArrayList
模型定义,这对于重新排序并不理想;将LinkedList
视为List
接口的替代实现。
答案 1 :(得分:1)
一种解决方案是我如何为国际象棋棋盘解决这个问题。该板由一个JPanel网格组成,每个JPanel可以容纳一个或多个JLabel(用图像保存棋子)。如果我点击一个包含JLabel的JPanel,JLabel会被踢到顶层窗口的glasspane上,然后用鼠标拖动。当鼠标被释放时,MouseListener会检测我所在的网格的JPanel,国际象棋引擎确定这是否是一个有效的移动,如果是,则JLabel被添加到鼠标光标所在的JPanel。如果没有,JLabel会回到原来的JPanel。 JPanels使用GridBagLayout,因此如果添加了JLabel,它将集中显示在JPanel单元格中。