📄 draggablecomponent.java
字号:
if (enabled && mousePressed) {
Point p = SwingUtilities.convertPoint((JComponent) e.getSource(), e.getPoint(), component);
if (dragStarted || enableInsideDrag || !component.contains(p)) {
if (reorderEnabled)
doDrag(p);
else
dragStarted = true;
fireDraggedEvent(EventUtil.convert(e, component, p));
}
}
}
private void dragCompleted(MouseEvent e) {
mousePressed = false;
dragStarted = false;
KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(abortDragKeyDispatcher);
if (e == null) {
restoreComponentOrder();
fireNotDroppedEvent();
}
else if (!checkParentContains(
SwingUtilities.convertPoint((JComponent) e.getSource(), e.getPoint(), component.getParent()))) {
restoreComponentOrder();
fireDroppedEvent(EventUtil.convert(e, component));
}
else {
fireDroppedEvent(EventUtil.convert(e, component));
//if (component.contains(p))
if (!selectOnMousePress && !e.isShiftDown())
fireSelectedEvent();
}
fireChangedEvent(DraggableComponentEvent.TYPE_RELEASED);
}
private void updateParent() {
if (component.getParent() != null) {
ComponentUtil.validate(component.getParent());
//component.getParent().repaint();
}
}
private void doDrag(Point p) {
dragStarted = true;
JComponent parent = (JComponent) component.getParent();
if (parent.getComponentCount() == 1)
return;
Point p2 = SwingUtilities.convertPoint(component, p, parent);
int toIndex = getMoveComponentIndex(p2);
if (toIndex != -1) {
toIndex = Math.min(toIndex, parent.getComponentCount() - 1);
Component fromComponent = getComponent(parent, dragIndex);
int fromDimension;
int toPos;
int toDimension;
if (isVerticalDrag()) {
fromDimension = fromComponent.getHeight();
toPos = (int) SwingUtilities.convertPoint(parent, p2, getComponent(parent, toIndex)).getY();
toDimension = getComponent(parent, toIndex).getHeight();
}
else {
fromDimension = fromComponent.getWidth();
toPos = (int) SwingUtilities.convertPoint(parent, p2, getComponent(parent, toIndex)).getX();
toDimension = getComponent(parent, toIndex).getWidth();
}
if ((toIndex > dragIndex && toDimension - toPos > fromDimension) ||
((dragIndex == -1 || toIndex < dragIndex) && toPos > fromDimension))
return;
if (dragIndex != -1 && dragIndex != toIndex) {
removeComponent(parent, fromComponent, dragIndex);
addComponent(parent, fromComponent, toIndex);
fireChangedEvent(DraggableComponentEvent.TYPE_MOVED);
}
}
if (toIndex < 0) {
restoreComponentOrder();
}
else
dragIndex = toIndex;
}
private boolean isVerticalDrag() {
JComponent parent = (JComponent) component.getParent();
if (parent.getComponentCount() > 1)
return getComponent(parent, 0).getY() < getComponent(parent, 1).getY();
return false;
}
private boolean checkParentContains(Point p) {
if (outerParentArea == null)
return component.getParent().contains(p);
Point p2 = SwingUtilities.convertPoint(component.getParent(), p, outerParentArea);
if (detectOuterAreaAsLine) {
Insets i = new Insets(0, 0, 0, 0);//outerParentArea.getInsets();
return component.getParent().contains(p)
||
(outerParentArea.contains(p2) &&
(isVerticalDrag()
?
(p2.getX() >= i.left && p2.getX() < (outerParentArea.getWidth() - i.right))
:
(p2.getY() >= i.top && p2.getY() < (outerParentArea.getHeight() - i.bottom))));
}
return component.getParent().contains(p) || outerParentArea.contains(p2);
}
private int getMoveComponentIndex(Point p) {
JComponent parent = (JComponent) component.getParent();
if (checkParentContains(p)) {
boolean vertical = isVerticalDrag();
for (int i = 0; i < parent.getComponentCount() - 1; i++) {
Point p2 = getComponent(parent, i + 1).getLocation();
if (vertical) {
if (p.getY() >= 0 && p.getY() < p2.getY())
return i;
}
else {
if (p.getX() >= 0 && p.getX() < p2.getX())
return i;
}
}
if (dragIndex == -1)
return parent.getComponentCount();
else if (vertical)
return p.getY() < 0 ? 0 : parent.getComponentCount() - 1;
else
return p.getX() < 0 ? 0 : parent.getComponentCount() - 1;
}
return -1;
}
private JComponent getComponent(Container parent, int index) {
if (layoutOrderList != null)
return (JComponent) layoutOrderList.get(index);
return (JComponent) parent.getComponent(index);
}
private int getComponentIndex(Component c) {
if (layoutOrderList != null)
return layoutOrderList.indexOf(c);
return ComponentUtil.getComponentIndex(c);
}
private void addComponent(Container parent, Component c, int index) {
if (layoutOrderList != null) {
layoutOrderList.add(index, c);
parent.add(c, index);
}
else
parent.add(c, index);
revalidateComponentTree((JComponent) c);
}
private void removeComponent(Container parent, Component c, int index) {
revalidateComponentTree((JComponent) c);
if (layoutOrderList != null)
if (index < 0) {
layoutOrderList.remove(c);
parent.remove(c);
}
else {
Component tmp = (Component) layoutOrderList.get(index);
layoutOrderList.remove(index);
parent.remove(tmp);
}
else if (index < 0)
parent.remove(c);
else
parent.remove(index);
}
private void revalidateComponentTree(JComponent c) {
Container parent = c.getParent();
int index = ComponentUtil.getComponentIndex(c);
if (index > 0)
doRevalidateComponentTree((JComponent) parent.getComponent(index - 1));
doRevalidateComponentTree(c);
if (index < parent.getComponentCount() - 1)
doRevalidateComponentTree((JComponent) parent.getComponent(index + 1));
}
private void doRevalidateComponentTree(JComponent c) {
c.revalidate();
int count = c.getComponentCount();
for (int i = 0; i < count; i++)
doRevalidateComponentTree(((JComponent) c.getComponent(i)));
}
private void restoreComponentOrder() {
if (reorderEnabled && dragIndex != -1 && dragFromIndex != -1 && dragIndex != dragFromIndex) {
Container parent = component.getParent();
Component comp = getComponent(parent, dragIndex);
removeComponent(parent, comp, -1);
dragIndex = dragFromIndex;
addComponent(parent, comp, dragIndex);
fireChangedEvent(DraggableComponentEvent.TYPE_MOVED);
}
}
private void fireChangedEvent(int type) {
updateParent();
if (listeners != null) {
DraggableComponentEvent event = new DraggableComponentEvent(this, type);
Object[] l = listeners.toArray();
for (int i = 0; i < l.length; i++)
((DraggableComponentListener) l[i]).changed(event);
}
}
private void fireSelectedEvent() {
updateParent();
if (listeners != null) {
DraggableComponentEvent event = new DraggableComponentEvent(this);
Object[] l = listeners.toArray();
for (int i = 0; i < l.length; i++)
((DraggableComponentListener) l[i]).selected(event);
}
}
private void fireDraggedEvent(MouseEvent mouseEvent) {
dragEventFired = true;
if (listeners != null) {
DraggableComponentEvent event = new DraggableComponentEvent(this, mouseEvent);
Object[] l = listeners.toArray();
for (int i = 0; i < l.length; i++)
((DraggableComponentListener) l[i]).dragged(event);
}
}
private void fireDroppedEvent(MouseEvent mouseEvent) {
updateParent();
if (dragEventFired) {
dragEventFired = false;
if (listeners != null) {
DraggableComponentEvent event = new DraggableComponentEvent(this, mouseEvent);
Object[] l = listeners.toArray();
for (int i = 0; i < l.length; i++)
((DraggableComponentListener) l[i]).dropped(event);
}
}
}
private void fireNotDroppedEvent() {
updateParent();
if (dragEventFired) {
dragEventFired = false;
if (listeners != null) {
DraggableComponentEvent event = new DraggableComponentEvent(this);
Object[] l = listeners.toArray();
for (int i = 0; i < l.length; i++)
((DraggableComponentListener) l[i]).dragAborted(event);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -