JScrollPane中的Java可拖动JPanel与boxLayout

时间:2015-03-04 21:45:24

标签: java draggable jscrollpane boxlayout

我有(1)包含(2)JPanel和BoxLayout的JPanel。 (2)JPanel可以包含任意数量的(n)具有FlowLayout的JPanel(没有订单)。 (1)使用JScrollPaneLayout将JPanel放入JScrollPane。我希望(n)JPanels可以拖动来切换(n)JPanels的位置,但仍然保持BoxLayout。例如,我有带有BoxLayout的JPanel和4个JPanels,我想在第一个和第二个之间插入第四个JPanel,在第二个JPanel之间拖动它,初始第二个JPanel会自动移动到第三个位置。

我已经制作了(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 个答案:

答案 0 :(得分:0)

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

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