Drag and drop dragging problems

时光毁灭记忆、已成空白 提交于 2020-01-16 14:54:12

问题


This program is a drag and drop of an image in the grid lines

This is the actual code:

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import javax.swing.*;

public class DragAndDrop extends JFrame
{
    WATCanvas canvas;

    public DragAndDrop()
    {
        super();
        Container container = getContentPane();
        setBackground(Color.WHITE);
        canvas = new WATCanvas(800,600,45,40);
        container.add(canvas);

        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(1, 2));

        container.add(panel, BorderLayout.SOUTH);

        addWindowListener(new WindowAdapter() {
          public void windowClosing(WindowEvent e) {
            System.exit(0);
          }
        });
            setSize(1200,1000);
            setVisible(true);

    }

    class WATCanvas extends JPanel
    {
        Cursor curSP, curCSF, curCDF, curUB, curPP, curMod, curKD, cur;
        int buttonLeftBorder = 900;
        int buttonTopBorder = 20;
        double spX=buttonLeftBorder, spY=buttonTopBorder+10, spW=20, spH=20;//singlePallet coordinates
        double csFX=buttonLeftBorder, csFY=buttonTopBorder+90, csFW=80, csFH=40;//caseFlow coordinates
        double cdFX=buttonLeftBorder, cdFY=buttonTopBorder+150, cdFW=40, cdFH=40;//caddyFlow coordinates
        double ubX=buttonLeftBorder, ubY=buttonTopBorder+210, ubW=80, ubH=20;//unloadBulk coordinates
        double ppX=buttonLeftBorder, ppY=buttonTopBorder+250, ppW=80, ppH=20;//prePick coordinates
        double modX=buttonLeftBorder, modY=buttonTopBorder+290, modW=40, modH=40;//module coordinates
        double kdX=buttonLeftBorder, kdY=buttonTopBorder+350, kdW=20, kdH=20;//kd coordinates
        int x1, y1, x2, y2;
        int width, height, rows, cols;

        Rectangle2D singlePallet;
        Rectangle2D caseFlow;
        Rectangle2D caddyFlow;
        Rectangle2D unloadBulk;
        Rectangle2D prePick;
        Rectangle2D module;
        Rectangle2D kd;
        Rectangle2D selectedShape;
        Rectangle2D boundingRec;

        public WATCanvas(int w, int h, int r, int c)
        {
            setBackground(Color.white);
            setSize(width = w, height = h);
            rows = r;
            cols = c;
            addMouseListener(new MyMouseListener());
            addMouseMotionListener(new MyMouseMotionListener());
            setTitle("Warehouse Allocation Model");
        }

        public void paint(Graphics g)
        {
            Font insideDrawing = new Font("TimesRoman",Font.PLAIN, 9);
            Font boldDescription = new Font("TimesRoman", Font.BOLD, 10);

            Graphics2D g2 = (Graphics2D) g;

            //single pallet location
            singlePallet = new Rectangle2D.Double(spX,spY,spW,spW);
            g2.draw(singlePallet);
            g2.setFont(insideDrawing);
            g2.drawString("xxx", buttonLeftBorder+05, buttonTopBorder+15);
            g2.setFont(boldDescription);
            g2.drawString("Single Pallet Lane", buttonLeftBorder+25, buttonTopBorder+20);

            //Multiple Pallets
            g2.setFont(insideDrawing);
            g2.drawString("xxx",buttonLeftBorder+05,buttonTopBorder+55);
            g2.drawRect(buttonLeftBorder, buttonTopBorder+50, 20, 20);
            g2.drawRect(buttonLeftBorder+20, buttonTopBorder+50, 20, 20);
            g2.drawRect(buttonLeftBorder+40, buttonTopBorder+50, 20, 20);
            g2.drawRect(buttonLeftBorder+60, buttonTopBorder+50, 20, 20);
            g2.setFont(boldDescription);
            g2.drawString("Flow Lane (4-deep example)", buttonLeftBorder+85, buttonTopBorder+60);

            //Case Flow
            caseFlow = new Rectangle2D.Double(csFX,csFY,csFW,csFH);
            g2.setFont(insideDrawing);
            g2.drawString("Case Flow", buttonLeftBorder+20, buttonTopBorder+115);
            g2.draw(caseFlow);
            g2.setFont(boldDescription);
            g2.drawString("Standard Case Flow Rack", buttonLeftBorder+85, buttonTopBorder+115);

            //Caddy Flow

            caddyFlow = new Rectangle2D.Double(cdFX,cdFY,cdFW,cdFH);
            g2.setFont(insideDrawing);
            g2.drawString("Caddy",buttonLeftBorder+10, buttonTopBorder+170);
            g2.drawString("Flow",buttonLeftBorder+12,buttonTopBorder+180);
            g2.draw(caddyFlow);
            g2.setFont(boldDescription);
            g2.drawString("Standard Caddy Flow Rack", buttonLeftBorder+45, buttonTopBorder+175);

            //Unload Bulk Door

            unloadBulk = new Rectangle2D.Double(ubX,ubY,ubW,ubH);
            g2.setFont(insideDrawing);
            g2.setColor(Color.BLACK);
            g2.fill(unloadBulk);
            g2.setColor(Color.WHITE);
            g2.drawString("Unload/Bulk Door", buttonLeftBorder+3, buttonTopBorder+223);
            g2.setColor(Color.BLACK);
            g2.setFont(boldDescription);
            g2.drawString("Unload/Bulk Door", buttonLeftBorder+85, buttonTopBorder+223);

            //Pre-Pick Trad

            prePick = new Rectangle2D.Double(ppX,ppY,ppW,ppH);
            g2.setFont(insideDrawing);
            g2.fill(prePick);
            g2.setColor(Color.WHITE);
            g2.drawString("PP/Trad",buttonLeftBorder+20, buttonTopBorder+263);
            g2.setFont(boldDescription);
            g2.setColor(Color.BLACK);
            g2.drawString("Pre-Pick Module", buttonLeftBorder+85, buttonTopBorder+263);

            //Module with spotted pattern

            module = new Rectangle2D.Double(modX,modY,modW,modH);
            g2.setFont(insideDrawing);
            BufferedImage bi = new BufferedImage(5,5,BufferedImage.TYPE_INT_RGB);
            Graphics2D big = bi.createGraphics();
            big.setColor(Color.WHITE);
            big.fillRect(0, 0, 5, 5);
            big.setColor(Color.LIGHT_GRAY);
            big.fillOval(2, 2, 2, 2);

            TexturePaint tp = new TexturePaint(bi, new Rectangle(5,5));

            g2.setPaint(tp);
            g2.fill(module);
            g2.setFont(boldDescription);
            g2.setColor(Color.BLACK);
            g2.drawString("Module", buttonLeftBorder+04, buttonTopBorder+310);
            g2.draw(module);
            g2.setFont(boldDescription);
            g2.drawString("Standard Caddy Flow Rack", buttonLeftBorder+45, buttonTopBorder+310);

            //KD with spotted pattern

            kd = new Rectangle2D.Double(kdX,kdY,kdW,kdH);
            BufferedImage bi2 = new BufferedImage(5,5,BufferedImage.TYPE_INT_RGB);
            Graphics2D big2 = bi2.createGraphics();
            big2.setColor(Color.DARK_GRAY);
            big2.fillRect(0, 0, 5, 5);
            big2.setColor(Color.BLACK);
            big2.fillOval(2, 2, 2, 2);

            TexturePaint tp2 = new TexturePaint(bi2, new Rectangle(5,5));

            g2.setPaint(tp2);
            g2.fill(kd);
            g2.setFont(boldDescription);
            g2.setColor(Color.BLACK);
            g2.drawString("KD", buttonLeftBorder+4, buttonTopBorder+365);
            g2.draw(kd);
            g.setFont(boldDescription);
            g.drawString("KD Stands", buttonLeftBorder+25, buttonTopBorder+365);

            width = 900;
            height = 800;
            int start = 25;

            int rowHt = 20;
            for(int j=0;j<=rows;++j)
                g.drawLine(start, start + j*rowHt, height+start,start + j*rowHt);

            int rowWid = 20;
            for(int k=0;k<=cols;++k)
                g.drawLine(start+k*rowWid, start, start + k*rowWid, width+start);

            if (cur != null)
                setCursor(cur);
        }

        class MyMouseListener extends MouseAdapter
        {
            public void mousePressed(MouseEvent e)
            {
                if (singlePallet.contains(e.getX(), e.getY()))
                {
                    selectedShape = singlePallet;
                    if (boundingRec != null)
                        boundingRec = singlePallet.getBounds2D();
                }
                else if (caseFlow.contains(e.getX(), e.getY()))
                {
                    selectedShape = caseFlow;
                    if (boundingRec != null)
                        boundingRec = caseFlow.getBounds2D();
                }
                else if (caddyFlow.contains(e.getX(), e.getY()))
                {
                    selectedShape = caddyFlow;
                    if (boundingRec != null)
                        boundingRec = caddyFlow.getBounds2D();
                }
                else if (unloadBulk.contains(e.getX(), e.getY()))
                {
                    selectedShape = unloadBulk;
                    if (boundingRec != null)
                        boundingRec = unloadBulk.getBounds2D();
                }
                else if (prePick.contains(e.getX(), e.getY()))
                {
                    selectedShape = prePick;
                    if (boundingRec != null)
                        boundingRec = prePick.getBounds2D();
                }
                else if (module.contains(e.getX(), e.getY()))
                {
                    selectedShape = module;
                    if (boundingRec != null)
                        boundingRec = module.getBounds2D();
                }
                else if (kd.contains(e.getX(), e.getY()))
                {
                    selectedShape = kd;
                    if (boundingRec != null)
                        boundingRec = kd.getBounds2D();
                }
                else
                {
                    boundingRec = null;
                }

                canvas.repaint();
                x1 = e.getX();
                y1 = e.getY();
            }

            public void mouseReleased(MouseEvent e)
            {
                if (singlePallet.contains(e.getX(), e.getY()))
                {
                    boundingRec = singlePallet.getBounds2D();
                    selectedShape = singlePallet;
                }
                else if (caseFlow.contains(e.getX(), e.getY()))
                {
                    boundingRec = caseFlow.getBounds2D();
                    selectedShape = caseFlow;
                }
                else if (caddyFlow.contains(e.getX(), e.getY()))
                {
                    boundingRec = caddyFlow.getBounds2D();
                    selectedShape = caddyFlow;
                }
                else if (unloadBulk.contains(e.getX(), e.getY()))
                {
                    boundingRec = unloadBulk.getBounds2D();
                    selectedShape = unloadBulk;
                }
                else if (prePick.contains(e.getX(), e.getY()))
                {
                    boundingRec = prePick.getBounds2D();
                    selectedShape = prePick;
                }
                else if (module.contains(e.getX(), e.getY()))
                {
                    boundingRec = module.getBounds2D();
                    selectedShape = module;
                }
                else if (kd.contains(e.getX(), e.getY()))
                {
                    boundingRec = kd.getBounds2D();
                    selectedShape = kd;
                }

                //canvas.repaint();
            }

            public void mouseClicked(MouseEvent e)
            {
                if (singlePallet.contains(e.getX(), e.getY()))
                {
                    selectedShape = singlePallet;
                    boundingRec = singlePallet.getBounds2D();
                }
                else if (caseFlow.contains(e.getX(), e.getY()))
                {
                    selectedShape = caseFlow;
                    boundingRec = caseFlow.getBounds2D();
                }
                else if (caddyFlow.contains(e.getX(), e.getY()))
                {
                    selectedShape = caddyFlow;
                    boundingRec = caddyFlow.getBounds2D();
                }
                else if (unloadBulk.contains(e.getX(), e.getY()))
                {
                    selectedShape = unloadBulk;
                    boundingRec = unloadBulk.getBounds2D();
                }
                else if (prePick.contains(e.getX(), e.getY()))
                {
                    selectedShape = prePick;
                    boundingRec = prePick.getBounds2D();
                }
                else if (module.contains(e.getX(), e.getY()))
                {
                    selectedShape = module;
                    boundingRec = module.getBounds2D();
                }
                else if (kd.contains(e.getX(), e.getY()))
                {
                    selectedShape = kd;
                    boundingRec = kd.getBounds2D();
                }
                else
                {
                    if (boundingRec != null)
                        boundingRec = null;
                }
                canvas.repaint();
            }
        }

        class MyMouseMotionListener extends MouseMotionAdapter
        {
            public void mouseDragged(MouseEvent e) {
                if (singlePallet.contains(e.getX(), e.getY()))
                {
                    boundingRec = null;
                    selectedShape = singlePallet;
                    x2 = e.getX();
                    y2 = e.getY();
                    spX = spX + x2 - x1;
                    spY = spY + y2 - y1;
                    x1 = x2;
                    y1 = y2;       
                }
                else if (caseFlow.contains(e.getX(), e.getY()))
                {
                    boundingRec = null;
                    selectedShape = caseFlow;
                    x2 = e.getX();
                    y2 = e.getY();
                    csFX = csFX + x2 - x1;
                    csFY = csFY + y2 - y1;
                    x1 = x2;
                    y1 = y2;

                }
                else if (caddyFlow.contains(e.getX(), e.getY()))
                {
                    boundingRec = null;
                    selectedShape = caseFlow;
                    x2 = e.getX();
                    y2 = e.getY();
                    cdFX = cdFX + x2 - x1;
                    cdFY = cdFY + y2 - y1;
                    x1 = x2;
                    y1 = y2;

                }
                else if (unloadBulk.contains(e.getX(), e.getY()))
                {
                    boundingRec = null;
                    selectedShape = caseFlow;
                    x2 = e.getX();
                    y2 = e.getY();
                    ubX = ubX + x2 - x1;
                    ubY = ubY + y2 - y1;
                    x1 = x2;
                    y1 = y2;

                }
                else if (prePick.contains(e.getX(), e.getY()))
                {
                    boundingRec = null;
                    selectedShape = caseFlow;
                    x2 = e.getX();
                    y2 = e.getY();
                    ppX = ppX + x2 - x1;
                    ppY = ppY + y2 - y1;
                    x1 = x2;
                    y1 = y2;

                }
                else if (module.contains(e.getX(), e.getY()))
                {
                    boundingRec = null;
                    selectedShape = caseFlow;
                    x2 = e.getX();
                    y2 = e.getY();
                    modX = modX + x2 - x1;
                    modY = modY + y2 - y1;
                    x1 = x2;
                    y1 = y2;

                }
                else if (kd.contains(e.getX(), e.getY()))
                {
                    boundingRec = null;
                    selectedShape = caseFlow;
                    x2 = e.getX();
                    y2 = e.getY();
                    kdX = kdX + x2 - x1;
                    kdY = kdY + y2 - y1;
                    x1 = x2;
                    y1 = y2;

                }
      }

            public void mouseMoved(MouseEvent e)
            {
                if(singlePallet != null && caseFlow != null && caddyFlow != null && unloadBulk != null
                        && prePick != null && module != null && kd != null)
                {
                    if (singlePallet.contains(e.getX(), e.getY()))
                    {
                        cur = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
                    }

                    else if (caseFlow.contains(e.getX(), e.getY()))
                    {
                        cur = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
                    }

                    else if (caddyFlow.contains(e.getX(), e.getY()))
                    {
                        cur = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
                    }

                    else if (unloadBulk.contains(e.getX(), e.getY()))
                    {
                        cur = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
                    }

                    else if (prePick.contains(e.getX(), e.getY()))
                    {
                        cur = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
                    }

                    else if (module.contains(e.getX(), e.getY()))
                    {
                        cur = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
                    }

                    else if (kd.contains(e.getX(), e.getY()))
                    {
                        cur = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
                    }

                    else
                    {
                        cur = Cursor.getDefaultCursor();                   
                    }
            }
                canvas.repaint();
            }
        }

}
        public static void main(String arg[])
        {
            new DragAndDrop();
        }

}

the problem is that the dragging of image is slow and limited only the half of the actual image. All kinds of help will be appreciated :) thanks


回答1:


Add canvas.repaint() to the end of the mouseDragged method so that the changes can be painted...

public void mouseDragged(MouseEvent e) {
    //...
    canvas.repaint();
}

It is recommended that you use paintComponent instead of paint. Remember, these methods are but a single call a complex chain of actions. Unless you are completely aware of what you are doing, you should make sure you call super.paintXxx. This will, generally, prepare the Graphics context for painting, prevent what has previously begin painted to the supplied Graphics context to show up...

You're also doing a lot of work in you paint method. Consider using BufferedImages to render the more static elements (like the grid) until something changes and you have to update it...



来源:https://stackoverflow.com/questions/19938493/drag-and-drop-dragging-problems

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!