Java 带有 boxLayout 的 JScrollPane 中的可拖动 JPanel
Java draggable JPanel within JScrollPane with boxLayout
我有 (1)JPanel 包含 (2)JPanel with BoxLayout。 (2)JPanel 可以包含任意数量的 (n)JPanels 和 FlowLayout(没有订单)。 (1)使用JScrollPaneLayout将JPanel放入JScrollPane中。我希望 (n)JPanels 可以拖动以切换 (n)JPanels 的位置,但仍保持 BoxLayout。例如,我有带 BoxLayout 的 JPanel 和 4 个 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到位置来改变JPanel中使用BoxLayout的组件的位置,但我希望JPanel保持BoxLayout。
我最终使用的代码,可能对其他人有帮助。
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();
}
});
}
我有 (1)JPanel 包含 (2)JPanel with BoxLayout。 (2)JPanel 可以包含任意数量的 (n)JPanels 和 FlowLayout(没有订单)。 (1)使用JScrollPaneLayout将JPanel放入JScrollPane中。我希望 (n)JPanels 可以拖动以切换 (n)JPanels 的位置,但仍保持 BoxLayout。例如,我有带 BoxLayout 的 JPanel 和 4 个 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到位置来改变JPanel中使用BoxLayout的组件的位置,但我希望JPanel保持BoxLayout。
我最终使用的代码,可能对其他人有帮助。
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();
}
});
}