Java拖动图像更好&重叠图像检测

时间:2012-07-11 18:34:35

标签: java image swing mouse

我有两个问题要问你:

  1. [已解决] - 在java中,我可以使用鼠标侦听器移动图像。如果我单击并向上移动鼠标,它只是将图像向上移动,而不是将图像精确地移动到指针所在的位置。不要让图像跳转到我的鼠标指针所在的位置。

  2. [求助] - 由于我正在构建一个编辑器,如果我在窗口上有多个可以移动的图像,如果有两个重叠的图像,我该如何检测我应该移动哪个图像。如果我想移动图像后面而不是前面的一个,反之亦然。你们在这里做的最好的方法是什么。

  3. 与这两个问题相关的一些代码

    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
    
            }
        });
    

    感谢任何反馈。

    感谢。

2 个答案:

答案 0 :(得分:3)

  

我实际上是使用Graphics来绘制图像。

这是一个用户界面问题,可以追溯到最早的,广泛可用的object drawing programs。常见的方法是实现两个基本操作,使用户能够通过更改其呈现顺序来显示隐藏对象:

  • 向后移动:在 z -order。
  • 中向后移动选择一步
  • 向后移动:将选择移动到 z -order的背面。

通常包括两个互补的操作:

  • 前进:在 z -order。
  • 中将选择向前移动一步
  • 移至前方:将选区移至 z -order的前面。

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单元格中。