2015-03-04 3 views
1

У меня есть (1) JPanel, содержащий (2) JPanel с BoxLayout. (2) JPanel может содержать любое количество (n) JPanels с FlowLayout (нет заказов). (1) JPanel помещается в JScrollPane с помощью JScrollPaneLayout. Я хочу (n) JPanels перетащить, чтобы переключить позиции (n) JPanels, но все равно поддерживать BoxLayout. Например, у меня есть JPanel с BoxLayout и 4 JPanels, я хочу вставить четвертый JPanel между 1-м и 2-м, перетащив его между ними, начальная вторая JPanel будет автоматически перенесена на 3-е место.Java draggable JPanel внутри JScrollPane с boxLayout

я уже сделал (п) JPanels перетаскиваемым, но я не могу найти способ, чтобы получить положение, в котором они должны быть вставлены:

private void handleDrag(final JPanel panel){ 
    panel.addMouseListener(new MouseAdapter() { 

     @Override 
     public void mousePressed(MouseEvent me) { 
      panelX = me.getX(); 
      panelY = me.getY(); 
     } 

     @Override 
     public void mouseReleased(MouseEvent me2){ 

      // get position of Component 

      boxPanel.add(panel, position); 

      scroll.revalidate(); 
     } 
    }); 

    panel.addMouseMotionListener(new MouseMotionAdapter() { 

     @Override 
     public void mouseDragged(MouseEvent me) { 
      me.translatePoint(me.getComponent().getLocation().x - panelX, me.getComponent().getLocation().y - panelY); 
      panel.setLocation(0, me.getY()); 
     } 
    }); 

Я хочу, чтобы изменить положение компоненты в JPanel, используя BoxLayout, перетащив JPanel в позицию, но я хочу, чтобы JPanel поддерживал BoxLayout.

ответ

0

Код Я в конечном итоге использую, может быть полезно кому-то другому.

private void handleDrag(final JPanel panel){ 

    panel.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mousePressed(MouseEvent me) { 
      panelY = me.getY(); 

      panelNo = rowPanel.indexOf(panel); 
      tempItem = rowPanel.get(panelNo); 

      tempItem.setBackground(panelActiveColor); 
      tempItem.setBorder(BorderFactory.createRaisedBevelBorder()); 
     } 

     @Override 
     public void mouseReleased(MouseEvent me){ 

      tempItem.setBackground(panelColor); 
      tempItem.setBorder(BorderFactory.createEmptyBorder()); 
      scroll.revalidate(); 
     } 
    }); 

    panel.addMouseMotionListener(new MouseMotionAdapter() { 
     @Override 
     public void mouseDragged(MouseEvent me) { 
      me.translatePoint(0, me.getComponent().getLocation().y - panelY); 

      int temp; 

      if((int) ((me.getY() - panelY)/me.getComponent().getSize().height) < 0){ 
       temp = 0; 
      } 
      else if((int) ((me.getY() - panelY)/me.getComponent().getSize().height) < (elementsAmount - 1)){ 
       temp = (me.getY() - panelY)/me.getComponent().getSize().height + 1; 
      } 
      else{ 
       temp = (elementsAmount - 1); 
      } 

      rowPanel.remove(tempItem); 

      rowPanel.add(temp, tempItem); 

      boxPanel.add(tempItem, temp); 

      scroll.revalidate(); 
     } 
    }); 
} 
Смежные вопросы