2

我有两个问题要问你:

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

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

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

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

        }
    });

任何反馈表示赞赏。

谢谢。

4

2 回答 2

3

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

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

  • 向后移动:将选择按z顺序向后移动。
  • 移到后面:将选择移到z顺序的后面。

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

  • 向前移动:将选择按z顺序向前移动一步。
  • 移到前面:将选择移到z顺序的前面。

GraphPanel说明了在 Java 2D 中命中测试和处理多项选择的几种技术。它说明了至少一些对象是可见的更简单的情况。它的渲染顺序是由一个简单的List<Node>模型 using定义的ArrayList,这对于重新排序并不理想;考虑LinkedList作为List接口的替代实现。

于 2012-07-11T22:54:00.503 回答
1

一种解决方案是我如何为棋盘解决这个问题。棋盘由 JPanel 网格组成,每个 JPanel 可以容纳一个或 0 个 JLabel(用于保存带有图像的棋子)。如果我单击包含 JLabel 的 JPanel,则 JLabel 会被踢到顶层窗口的玻璃窗格上,然后用鼠标拖动。释放鼠标时,MouseListener 会检测到我在哪个网格的 JPanel 上,国际象棋引擎确定这是否是有效的移动,如果是,则将 JLabel 添加到鼠标光标所在的 JPanel 中。如果不是,则 JLabel 将返回其原始 JPanel。JPanel 使用 GridBagLayout,因此如果向其中添加 JLabel,它将在 JPanel 单元格中集中显示。

于 2012-07-11T18:39:24.087 回答