Почему перетаскивание этой панели создает эффект разрыва экрана? - PullRequest
0 голосов
/ 29 марта 2019

При перетаскивании этих «плиток», которые являются объектами jPanel, друг на друга или другую Jpanel, они оставляют контур пути через объект.

Я пытался каждый раз использовать функцию перекраски на панеляхони перетаскиваются или щелкаются EventListener, но это, похоже, не решает проблему.

/// tile class
import javax.swing.*;
import java.awt.*;

public class Tile extends JPanel {
 private static final long serialVersionUID = 1L;
 /** Tile objects to be added to the game board.
  * The constructor should eventually create the maze pattern
  * and determine the tiles initial location. 
  */
 DragListener drag;
 public int ID;
 Tile()
 {
  drag = new DragListener();

  this.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
  this.addMouseListener( drag );
  this.addMouseMotionListener( drag );
 }

 public void paint(Graphics t)
 {
  t.setFont(new Font("Ariel",0,18));
  FontMetrics fm = getFontMetrics(new Font("Ariel",0,18));
  String id = Integer.toString(ID);
  t.setColor(Color.white);
  t.fillRect(0, 0, 80, 80);
  t.drawRect(0, 0, 80, 80);
  t.setColor(Color.black);
  t.drawString(id,5,20);
 }
}


// my drag listener class

import java.awt.Component;
import java.awt.Point;
import java.awt.event.MouseEvent;

import javax.swing.event.MouseInputAdapter;

public class DragListener extends MouseInputAdapter {

        Point location;
        MouseEvent pressed;
        int tileID;
        int [] gridPos;
        int  initialX, initialY;
        boolean moved = false;
        int buffer =20;

        int [] gridMidX = {327,327,327,327,407,407,407,407,488,488,488,488,568,568,568,568};
        int [] gridMidY = {260,341,421,501,260,341,421,501,260,341,421,501,260,341,421,501};
        public void mousePressed(MouseEvent me)
        {
            pressed = me;
            Component component = me.getComponent();
            location = component.getLocation(location);
            if (!moved) {
            initialX = location.x;
            initialY = location.y; 
            moved = true;
            }
        }

        public void mouseDragged(MouseEvent me)
        {

            Component component = me.getComponent();
            location = component.getLocation(location);
            int x = location.x - pressed.getX() + me.getX();
            int y = location.y - pressed.getY() + me.getY();
            component.setLocation(x, y);

         }
       public void mouseReleased(MouseEvent me) {
           Component component = me.getComponent();
           location = component.getLocation(location);
           int x = location.x;
           int y = location.y;
           int p[] = findSnap(x,y);
           int z = p[0];
           int a = p[1];

            component.setLocation(z, a);
        }
        public int[] findSnap(int x, int y )
        {

         int xp=initialX, yp=initialY;
         int buff =50;
         int pos[] = new int[2];
         if(y>(gridPos[1]+buff) || y < (gridPos[0]-buff)|| x< (gridPos[2] - buff)|| x>(gridPos[3]+buff))
         {
            xp = initialX;
            yp = initialY;

         }
         else{
             //setGrid();
             for(int i=0; i<16; i++) {
                int a = gridMidX[i];
                int b = gridMidY[i];
                int hold [] =  {x,y};
                 if(check(a,b,hold )) {

                    pos[0] = a;
                    pos[1]= b;
                     return pos;
                 }
             }

         }
         pos[0] = xp;
         pos[1] = yp;
         return pos;
        }

        // we need to call in tile

        public boolean check (int e, int f, int [] grid) {

            int nearY,nearX;
            nearX = Math.abs(e-grid[0]);
            nearY = Math.abs(f-grid[1]);            
            if (nearX <=70 && nearY <= 70) {

                return true;
                }

            return false;
        }
}

Плитки должны быть в состоянии перетаскиваться через другую jPanel и не оставлять след того места, где их перетаскивали.Они делают это только при пересечении другой Jpanel внутри JFrame, у них, похоже, нет этой проблемы.

1 Ответ

0 голосов
/ 29 марта 2019
public void paint(Graphics t)

Не отменять краску ().

Пользовательская роспись выполняется путем переопределения метода paintComponent(...).

Тогда первое утверждение в методе должно быть:

super.paintComponent(...);

чтобы каждый раз рисовать фон, чтобы не допустить появления артефактов рисования.

...