Vin*_*nay 3 java swing jpanel jframe drag
我加入JPanel到JFrame一个JButton点击.它增加JPanel了框架.该按钮将继续添加JPanelto JFrameon click事件.没有限制.单击按钮时,我也会添加JPanels到a List.我这样做是因为添加了MouseMotionListenerfor循环来处理拖拽JPanel的问题.
我现在面临的问题是阻力.当我JPanel通过单击添加第一个并且如果我拖动它时,它正确地跟随鼠标光标坐标.当我添加一秒钟时JPanel,它也完全跟随鼠标.添加第二个后,如果尝试拖动第一个JPanel,第一个JPanel似乎遵循不同的坐标,初始位置将更改为其他位置.我不知道我在哪里犯了这个错误.请帮我解决这个问题.请仔细阅读以下代码.
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class MyFrame extends JFrame {
JButton jb;
List<JPanel> mypanels = new ArrayList<JPanel>();
public MyFrame() {
jb = new JButton("Add Panel");
jb.setBounds(10, 10, 100, 50);
setSize(new Dimension(1000, 600));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(null);
add(jb);
setVisible(true);
initialize();
}
public void initialize() {
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
JPanel panel = new JPanel();
panel.setBounds(150,150,200,200);
panel.setBackground(Color.black);
mypanels.add(panel);
add(panel);
repaint();
handleDrag();
}
});
}
public void handleDrag(){
for(int i=0;i<mypanels.size();i++) {
final int j = i;
mypanels.get(i).addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent me) {
me.translatePoint(me.getComponent().getLocation().x, me.getComponent().getLocation().y);
mypanels.get(j).setLocation(me.getX(), me.getY());
}
});
}
}
public static void main(String args[]) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
new MyFrame();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
小智 7
看起来你的handleDrag方法是在只有一个JPanel添加到List时为每个JPanel添加一个新的匿名监听器.只需要添加一次监听器,如果添加了多个监听器,则行为将变得奇怪.
这是一个更新的handleDrag方法
public void handleDrag(JPanel panel){
final JPanel p = panel;
panel.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent me) {
me.translatePoint(me.getComponent().getLocation().x, me.getComponent().getLocation().y);
p.setLocation(me.getX(), me.getY());
}
});
}
Run Code Online (Sandbox Code Playgroud)
小智 5
Joe是正确的,这是我在我的项目中使用handleDrag方法:
public void handleDrag(final JPanel panel){
panel.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent me) {
x = me.getX();
y = me.getY();
}
});
panel.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent me) {
me.translatePoint(me.getComponent().getLocation().x-x, me.getComponent().getLocation().y-y);
panel.setLocation(me.getX(), me.getY());
}
});
}
Run Code Online (Sandbox Code Playgroud)
这样,面板在点击时不会进行初始"跳跃".