2013-08-23 4 views
1

Существует группа из 10 JPanels, которые помещаются в GridLayout. Теперь я хочу перетащить один JPanel (например, панель 1) и поместить его поверх другого JPanel (например, panel2) и переместить панель2 влево или вправо и поместить панель1 в положение panel2. Я могу перетащить JPanel с помощью опции перетаскивания, но я не могу отбросить его в нужную позицию. Мне нужна помощь в перемещении панелей в месте падения. Извините, если мой вопрос непонятен. Надеюсь ты понимаешь. Спасибо заранее.Перетаскивание и перемещение JPanels в группе JPanels

+0

Вы можете проверить наличие столкновений между перетаскиваемой панелью и другими, а затем переключить позиции при столкновении ... но, вероятно, лучший способ сделать это. – Fernando

+0

Фернандо: Есть ли у нас метод проверки на столкновение? Или есть другой способ? – Rookie86

+0

Да, panel.getBounds() возвращает объект * Rectangle *, который вы можете использовать для вызова rectangle.insersects (anotherRectangle). – Fernando

ответ

0

Вы могли бы попробовать это, но, как я сказал, что, вероятно, лучший способ:

public JPanel getPanelColliding(JPanel dragPanel, JPanel[] panels) 
{ 
    Rectangle rDrag = dragPanel.getBounds(); 

    for (JPanel panel : panels){ 
    if (panel == dragPanel) continue; 

    Rectangle r = panel.getBounds(); 
    if (r.insersects(rDrag)) 
     return r; 
    } 

    return null; 
} 

Затем в дрэг слушателя можно назвать и расположение панели подкачки, если getPanelColliding() не ноль. Я не тестировал это, но он должен работать!

+0

Спасибо Фернандо, попробуем и вернемся. – Rookie86

+0

Это, безусловно, начало решать проблему, но я согласен с вами в том, что может быть лучший способ. – Rookie86

+0

Вы должны поменять местами, кстати, не JPanels. Может быть, * setLocation() * – Fernando

0

Что-то похожее на это, но перемещение SWT Control(s).

Мои управления были рядом друг с другом (без пробела между ними), поэтому, когда я уронить Control1, он будет знать, на каком Control2 это при падении (с control2.getBounds().contains(dropPoint)).

После этого я Сопоставьте dropPoint к Control2, и выяснить, если dropPoint находится слева или справа от Control2 «s ширины. Затем я просто перемещаю control1 с moveAbove(control2) или moveBelow(control2).

Наконец, я вызываю container.layout() (container является родительским элементом элементов управления), чтобы уведомить своих детей о том, что макет изменился, и дети перемещаются.

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