Java 带有 boxLayout 的 JScrollPane 中的可拖动 JPanel

Java draggable JPanel within JScrollPane with boxLayout

我有 (1)JPanel 包含 (2)JPanel with BoxLayout。 (2)JPanel 可以包含任意数量的 (n)JPanels 和 FlowLayout(没有订单)。 (1)使用JScrollPaneLayout将JPanel放入JScrollPane中。我希望 (n)JPanels 可以拖动以切换 (n)JPanels 的位置,但仍保持 BoxLayout。例如,我有带 BoxLayout 的 JPanel 和 4 个 JPanel,我想通过将其拖动到第 1 个和第 2 个之间来插入第 4 个 JPanel,最初的第 2 个 JPanel 将自动移动到第 3 个位置。

我已经将 (n)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到位置来改变JPanel中使用BoxLayout的组件的位置,但我希望JPanel保持BoxLayout。

我最终使用的代码,可能对其他人有帮助。

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();
        }
    });
}