我有(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。
答案 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();
}
});
}