Я написал DragAndDrop MouseListener.
Компонент A — это фоновое изображение, которое находится за компонентом B. Оба они расположены на панели JPanel.
Я сделал изображение перетаскиваемым. Однако я хочу, чтобы изображение оставалось за компонентом B, когда я его перетаскиваю.
Однако каждый раз, когда я перетаскиваю изображение, я полагаю, что Java выделяет ему фокус или что-то в этом роде, поэтому оно выводится на передний план.
Есть ли метод, который может удерживать изображение сзади, даже когда я его перетаскиваю?
Я знаю, что могу использовать JLayeredPane
и использовать метод moveToBack
каждый раз, когда я перетаскиваю, но я бы предпочел не использовать JLayeredPane и просто использовать JPanel. Есть ли эквивалент moveToBack
для JPanel?
Или есть способ заставить компонент сохранить текущий слой (возможно, не получить фокус), чтобы я мог перетаскивать его в текущий слой?
ВОТ ПРИМЕР
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class OverlapTester extends JFrame {
public static final long serialVersionUID = 172L;
public static void main(String[] args) {
OverlapTester frame = new OverlapTester();
frame.initialize();
}
public void initialize() {
setLayout(null);
JButton bottom = new JButton("bottom");
JButton top = new JButton("top");
bottom.setBounds(0,0,100,100);
top.setBounds(0,0,50,50);
add(top);
add(bottom);
int bottomZOrder = 0;
bottom.addMouseListener(new MouseListener(){
@Override
public void mouseEntered(MouseEvent e) {
e.getComponent().getParent().setComponentZOrder(e.getComponent(), bottomZOrder);
}
@Override
public void mouseExited(MouseEvent e) {
e.getComponent().getParent().setComponentZOrder(e.getComponent(), bottomZOrder);
}
@Override
public void mouseReleased(MouseEvent e) {
e.getComponent().getParent().setComponentZOrder(e.getComponent(), bottomZOrder);
}
@Override
public void mousePressed(MouseEvent e) {
e.getComponent().getParent().setComponentZOrder(e.getComponent(), bottomZOrder);
}
@Override
public void mouseClicked(MouseEvent e) {
e.getComponent().getParent().setComponentZOrder(e.getComponent(), bottomZOrder);
}
});
bottom.addMouseMotionListener(new MouseMotionListener(){
@Override
public void mouseDragged(MouseEvent e) {
e.getComponent().getParent().setComponentZOrder(e.getComponent(), bottomZOrder);
}
@Override
public void mouseMoved(MouseEvent e) {
e.getComponent().getParent().setComponentZOrder(e.getComponent(), bottomZOrder);
}
});
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setExtendedState(MAXIMIZED_BOTH);
setVisible(true);
}
}