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

Posted

技术标签:

【中文标题】带有 boxLayout 的 JScrollPane 中的 Java 可拖动 JPanel【英文标题】:Java draggable JPanel within JScrollPane with boxLayout 【发布时间】:2015-05-06 02:25:36 【问题描述】:

我有 (1)JPanel,其中包含 (2)JPanel 和 BoxLayout。 (2)JPanel 可以包含任意数量的 (n) 个带有 FlowLayout 的JPanel(没有订单)。 (1)使用JScrollPaneLayout将JPanel放入JScrollPane。我希望 (n)JPanels 可拖动以切换 (n)JPanels 的位置,但仍保持 BoxLayout。例如,我有带有 BoxLayout 和 4 个 JPanel 的 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 拖动到位置来使用 BoxLayout 更改 JPanel 中组件的位置,但我希望 JPanel 保持 BoxLayout。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于带有 boxLayout 的 JScrollPane 中的 Java 可拖动 JPanel的主要内容,如果未能解决你的问题,请参考以下文章

将JLabel添加到使用BoxLayout的JFrame

Kivy BoxLayout 将小部件与顶部边框对齐

Kivy 布局高度以适应子小部件的高度

Java AWT 图形界面编程LayoutManager 布局管理器 ⑥ ( BoxLayout 布局 )

Java AWT 图形界面编程LayoutManager 布局管理器 ⑥ ( BoxLayout 布局 )

Java GUI为啥BoxLayout面板在其中有另一个BoxLayout面板时表现得很奇怪