2014-02-18 2 views
0

Я перетаскиваю JLabel по экрану, и когда я выхожу выше JPanel, он должен привязываться к тому месту, где он полностью закрывает JPanel. Кроме того, если я выпустлю где-нибудь еще, он должен привязываться к исходному положению. У меня есть мгновенная часть, но я не знаю, как сказать, что это над JPanel. У меня есть код ниже.Как узнать, где находится JPanel при перетаскивании JLabel

import java.awt.Color; 
    java.awt.Dimension; 
    import javax.swing.*; 
    import javax.swing.event.MouseInputAdapter; 
    import java.awt.event.MouseEvent; 

public class Main { 
public static final int CARD_HEIGHT = 97; 
public static final int CARD_WIDTH = 73; 

/** 
* Mouse Handler components 
* Changes the location of the JLabel with the mouse 
*/ 
public static MouseInputAdapter mouseHandler = new MouseInputAdapter(){ 
    public int labelDisX; 
    public int labelDisY;     
    public void mousePressed(MouseEvent e) { 
     labelDisX = e.getX(); 
     labelDisY = e.getY(); 
     //move the card above all others 
     e.getComponent().getParent().setComponentZOrder(e.getComponent(), 0); 
     e.getComponent().getParent().repaint();   
    } 
    public void mouseReleased(MouseEvent e) { 
     //if not above panel, then move to original spot 
     if(!abovePanel()) { 
      e.getComponent().setLocation(labelDisX, labelDisY); 
     } 
    } 
    public void mouseDragged (MouseEvent e) { 
     JPanel panel = (JPanel) e.getComponent().getParent(); 
     //get preliminary new X coordinate 
     int newX = e.getComponent().getX() + e.getX() - labelDisX; 
     //get preliminary new Y coordinate 
     int newY = e.getComponent().getY() + e.getY() - labelDisY; 
     //Not moved off edges of JFrame 
     if(newX > panel.getWidth() - CARD_WIDTH) { 
      newX = panel.getWidth() - CARD_WIDTH;        
     }                  
     if(newY > panel.getHeight() - CARD_HEIGHT) {       
      newY = panel.getHeight() - CARD_HEIGHT;       
     }                  
     if(newX < 0) { newX = 0; }            
     if(newY < 0) { newY = 0; } 
     e.getComponent().setLocation(newX, newY); 
    } 
}; 

/** 
* check to see if the JLabel is above the JPanel 
* @return 
*/ 
public static boolean abovePanel() { 

    return false; 
} 

/** 
* Adds ability to drag to JLabel 
* @param label 
*/ 
public static void addDrag(JLabel label) { 
    System.out.println("Adding drag"); 
    label.addMouseMotionListener(mouseHandler);       
    label.addMouseListener(mouseHandler);  
} 

public static void main(String[] args) { 

// Create a JFrame 
JFrame frame = new JFrame("Example Frame"); 
// JPanel to add JLabels to 
JPanel panel = new JPanel(); 

// Add a drop target text area in the center of the frame 
DropTargetArea dropPanel = new DropTargetArea(); 
dropPanel.setPreferredSize(new Dimension(CARD_WIDTH, CARD_HEIGHT)); 
dropPanel.setBackground(Color.gray); 
panel.add(dropPanel); 

// Add several draggable labels to the container 
JLabel blue = new JLabel(); 
blue.setOpaque(true); 
blue.setPreferredSize(new Dimension(CARD_WIDTH, CARD_HEIGHT)); 
blue.setBackground(Color.blue); 
addDrag(blue); 


panel.add(blue); 


// Add the container to the frame 
frame.add(panel); 
// Display the frame 
frame.setPreferredSize(new Dimension(400,400)); 
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
frame.setVisible(true); 
frame.pack(); 
} 
} 

ответ

0

Я сделал это с помощью JLayeredPane, который содержит JPanel, что само по себе имеет сетку JPanel, используя BorderLayout, с каждым меньших JPanel, представляющих шахматный квадрат, и каждая меньшая JPanel может принимать одно JLabel. Я добавил MouseAdapter к самой JLayeredPane, и, щелкнув, он проверяет, находится ли передвижная JLabel ниже щелчка. Если это так, JLabel поднимается до DRAG_LAYER JLayeredPane, а затем, когда его отпускают, проверьте, какой JPanel курсор мыши закончил, и оставьте JLabel, если он действительный квадрат, в противном случае верните его в исходное положение. Вы можете увидеть мой код here.

Смежные вопросы