带有 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的主要内容,如果未能解决你的问题,请参考以下文章
Java AWT 图形界面编程LayoutManager 布局管理器 ⑥ ( BoxLayout 布局 )