【问题标题】:Java draggable JPanel within JScrollPane with boxLayout带有 boxLayout 的 JScrollPane 中的 Java 可拖动 JPanel
【发布时间】: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。

【问题讨论】:

    标签: java draggable jscrollpane 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();
            }
        });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      • 2012-03-12
      • 2021-06-21
      • 2014-04-19
      • 1970-01-01
      相关资源
      最近更新 更多