2013-08-25 3 views
2

Je suis capable de SWAP les panneaux mais ce n'est pas assez bon. Par exemple, si panel1 entre en collision avec panel2, il échange, mais si le même entre en collision avec panel3, panel3 se déplace aussi vers l'emplacement panel1 (ce que je ne veux pas faire). S'il y a environ 10 panneaux, et si je veux échanger panel1 avec panel10, ce n'est pas possible avec la logique actuelle. Est-ce que quelqu'un peut m'aider s'il vous plait.Échange JPanels dans un tableau de JPanels

Ci-dessous le code avec la logique ci-dessus:

import javax.swing.border.LineBorder; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class GDragAndDrop extends JFrame { 
    public GDragAndDrop() { 
     add(new op()); 
    } 

    public static void main(String[] args) { 
     GDragAndDrop frame = new GDragAndDrop(); 
     frame.setTitle("GDragAndDrop"); 
     frame.setSize(600, 600); 
     frame.setLocationRelativeTo(null);// Center the frame 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 

class op extends JPanel implements MouseListener, MouseMotionListener { 
    JPanel p; 
    Point pPoint; 
    Point p1; 
    Point p2; 
    MouseEvent pressed; 
    JPanel[] panels = new JPanel[3]; 

    public op() { 
     int b = 3; 
     int a = 0; 
     for (int i = 0; i < b; i++) { 
     panels[i] = new JPanel(); 
     panels[i].setBackground(Color.cyan); 
     panels[i].setBorder(new LineBorder(Color.black)); 
     a = a + 20; 
     panels[i].setPreferredSize(new Dimension(a, 400)); 
     panels[i].addMouseListener(this); 
     panels[i].addMouseMotionListener(this); 
     panels[i].setBorder(new LineBorder(Color.black)); 
     panels[i].setVisible(true); 
     panels[i].add("Center", new JLabel("To Move" + i)); 
     this.add(panels[i]); 
     } 
    } 

    public JPanel getPanelColliding(JPanel dragPanel) { 
     Rectangle rDrag = dragPanel.getBounds(); 
     for (int i = 0; i < 3; i++) { 
     if (panels[i] == dragPanel) 
      continue; 
     Rectangle r = panels[i].getBounds(); 
     if (r.intersects(rDrag)) { 
      return panels[i]; 
     } 
     } 
     return null; 
    } 

    public void mousePressed(MouseEvent e) { 
     int b = 3; 
     for (int i = 0; i < b; i++) { 
     if (e.getSource() == panels[i]) { 
      pressed = e; 
      p2 = panels[i].getLocation(); 
     } 
     } 
    } 

    @Override 
    public void mouseDragged(MouseEvent arg0) { 
     int b = 3; 
     for (int i = 0; i < b; i++) { 
     if (arg0.getSource() == panels[i]) { 
      pPoint = panels[i].getLocation(pPoint); 
      int x = pPoint.x - pressed.getX() + arg0.getX(); 
      int y = pPoint.y - pressed.getY() + arg0.getY(); 
      if (getPanelColliding(panels[i]) != null) { 
       JPanel DragP = new JPanel(); 
       DragP = getPanelColliding(panels[i]); 
       p1 = getPanelColliding(panels[i]).getLocation(p1); 
       int x1 = pPoint.x - pressed.getX() + arg0.getX(); 
       int y1 = pPoint.y - pressed.getY() + arg0.getY(); 
       panels[i].setLocation(x1, y1); 
       DragP.setLocation(p2); 
      } else 
       panels[i].setLocation(x, y); 
     } 
     } 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
    } 

    @Override 
    public void mouseMoved(MouseEvent e) { 
    } 
} 
+0

Ceci est un doublon possible de votre autre question similaire [Comment échanger JPanel quand il entre en collision une autre JPanel] (http://stackoverflow.com/questions/ 18421055/how-to-swap-jpanel-when-it-collisionne-un-autre-jpanel). Veuillez expliquer: en quoi ces questions sont-elles différentes? Pourquoi cette question ne devrait-elle pas être fermée en tant que doublon? –

+0

J'ai fermé la question précédente maintenant. S'il vous plaît aidez-moi avec cette question. Merci Hovercraft plein d'anguilles pour la supervision. – Rookie86

Répondre

2

Si vous ne voulez pas utiliser le glisser-déposer, et si vos JPanels sont en colonnes, puis ces suggestions: considérer

  • J'ai eu que cela fonctionne avec les conteneurs JPanel (la celui qui contient les multiples composants de la colonne) utilise un FlowLayout
  • J'ai ajouté le MouseAdapter en tant que MouseListener et MouseMotionListener au conteneur JPanel, pas les composants de la colonne.
  • J'ai obtenu le composant de colonne sélectionné en appelant getComponentAt(mouseEvent.getPoint()) sur le conteneur JPanel. Bien sûr, vérifiez que ce n'est pas nul.
  • Si le composant sélectionné n'est pas nul, alors je mets une variable selectedComponent avec ce composant, et place un JLabel d'espace réservé qui a le même preferredSize à sa place. Je le fais en supprimant tous les composants du conteneur JPanel, puis en les rajoutant tous à l'exception du composant sélectionné où j'ajoute à la place l'espace réservé JLabel. J'appelle ensuite revalider et repeindre sur le conteneur.
  • Pour faire glisser le composant sélectionné, élevez-le sur le panneau de verre (c'est-à-dire, ajoutez-le au panneau de verre).
  • rendre le glassPane visible et lui donner une disposition nulle.
  • Faites glisser le composant sélectionné dans le panneau de verre simplement en changeant son emplacement par rapport au panneau de verre.
  • Sur mouseReleased, identifiez le composant de la souris sur la souris, en utilisant de nouveau getComponentAt(...).
  • Retirez ensuite tous les composants du conteneur JPanel,
  • , puis ajoutez-les tous dans l'ordre souhaité.
  • Ensuite, appelez revalidate et repeindre sur le conteneur JPanel.

Par exemple:

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.GridBagLayout; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.*; 

public class SwapPanelEg extends JPanel { 
    private static final long serialVersionUID = 1594039652438249918L; 
    private static final int PREF_W = 400; 
    private static final int PREF_H = 400; 
    private static final int MAX_COLUMN_PANELS = 8; 
    private JPanel columnPanelsHolder = new JPanel(); 

    public SwapPanelEg() { 
     columnPanelsHolder.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5)); 

     for (int i = 0; i < MAX_COLUMN_PANELS; i++) { 
     int number = i + 1; 
     int width = 20 + i * 3; 
     int height = PREF_H - 30; 
     columnPanelsHolder.add(new ColumnPanel(number, width, height)); 
     } 

     MyMouseAdapter myMouseAdapter = new MyMouseAdapter(); 
     columnPanelsHolder.addMouseListener(myMouseAdapter); 
     columnPanelsHolder.addMouseMotionListener(myMouseAdapter); 

     setLayout(new GridBagLayout()); 
     add(columnPanelsHolder); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private class MyMouseAdapter extends MouseAdapter { 
     private JComponent selectedPanel; 
     private Point deltaLocation; 
     private JLabel placeHolder = new JLabel(); 
     private JComponent glassPane; 

     @Override 
     public void mousePressed(MouseEvent evt) { 
     if (evt.getButton() != MouseEvent.BUTTON1) { 
      return; 
     } 
     JPanel source = (JPanel) evt.getSource(); 
     selectedPanel = (JComponent) source.getComponentAt(evt.getPoint()); 

     if (selectedPanel == null) { 
      return; 
     } 

     if (selectedPanel == source) { 
      selectedPanel = null; 
      return; 
     } 

     glassPane = (JComponent) SwingUtilities.getRootPane(source).getGlassPane(); 
     glassPane.setVisible(true); 
     Point glassPaneOnScreen = glassPane.getLocationOnScreen(); 
     glassPane.setLayout(null); 
     Point ptOnScreen = evt.getLocationOnScreen(); 
     Point panelLocOnScreen = selectedPanel.getLocationOnScreen(); 

     int deltaX = ptOnScreen.x + glassPaneOnScreen.x - panelLocOnScreen.x; 
     int deltaY = ptOnScreen.y + glassPaneOnScreen.y - panelLocOnScreen.y; 

     deltaLocation = new Point(deltaX, deltaY); 

     Component[] allComps = source.getComponents(); 
     for (Component component : allComps) { 
      source.remove(component); 
      if (component == selectedPanel) { 
       placeHolder.setPreferredSize(selectedPanel.getPreferredSize()); 
       source.add(placeHolder); 
       selectedPanel.setSize(selectedPanel.getPreferredSize()); 
       int x = ptOnScreen.x - deltaLocation.x; 
       int y = ptOnScreen.y - deltaLocation.y; 
       selectedPanel.setLocation(x, y); 
       glassPane.add(selectedPanel); 
      } else { 
       source.add(component); 
      } 
     } 
     revalidate(); 
     repaint(); 

     } 

     @Override 
     public void mouseDragged(MouseEvent evt) { 
     if (selectedPanel != null) { 
      Point ptOnScreen = evt.getLocationOnScreen(); 

      int x = ptOnScreen.x - deltaLocation.x; 
      int y = ptOnScreen.y - deltaLocation.y; 
      selectedPanel.setLocation(x, y); 
      repaint(); 
     } 
     } 

     @Override 
     public void mouseReleased(MouseEvent evt) { 
     if (evt.getButton() != MouseEvent.BUTTON1) { 
      return; 
     } 
     if (selectedPanel == null) { 
      return; 
     } 

     JComponent source = (JComponent) evt.getSource(); 

     Component[] allComps = source.getComponents(); 
     Component overComponent = (JComponent) source.getComponentAt(evt 
       .getPoint()); 

     source.removeAll(); 

     if (overComponent != null && overComponent != placeHolder 
       && overComponent != source) { 
      for (Component component : allComps) { 
       if (component == placeHolder) { 
        source.add(overComponent); 
       } else if (component == overComponent) { 
        source.add(selectedPanel); 
       } else { 
        source.add(component); 
       } 
      } 
     } else { 
      for (Component component : allComps) { 
       if (component == placeHolder) { 
        source.add(selectedPanel); 
       } else { 
        source.add(component); 
       } 
      } 
     } 
     revalidate(); 
     repaint(); 
     selectedPanel = null; 
     } 
    } 

    private static void createAndShowGui() { 
     SwapPanelEg mainPanel = new SwapPanelEg(); 

     JFrame frame = new JFrame("SwapPanelEg"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

class ColumnPanel extends JPanel { 
    private static final long serialVersionUID = 5366233209639059032L; 
    private int number; 
    private int prefWidth; 
    private int prefHeight; 

    public ColumnPanel(int number, int prefWidth, int prefHeight) { 
     setName("ColumnPanel " + number); 
     this.number = number; 
     this.prefWidth = prefWidth; 
     this.prefHeight = prefHeight; 

     add(new JLabel(String.valueOf(number))); 
     setBorder(BorderFactory.createLineBorder(Color.black)); 
     setBackground(Color.cyan); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(prefWidth, prefHeight); 
    } 

    public int getNumber() { 
     return number; 
    } 

} 
+0

Merci beaucoup Hovercraft-pleins d'anguilles, c'est exactement ce dont j'avais besoin. Je luttais avec cette partie depuis longtemps. – Rookie86