gpt4 book ai didi

java - 将 JPanel 拖入 JFrame

转载 作者:搜寻专家 更新时间:2023-11-01 04:06:23 25 4
gpt4 key购买 nike

我在单击 JButton 时将 JPanel 添加到 JFrame。它将 JPanel 添加到框架中。该按钮将在点击事件中继续将 JPanel 添加到 JFrame。没有限制。单击按钮时,我也将 JPanels 添加到 List 中。我这样做是因为添加了 MouseMotionListener 使用 for 循环来处理 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();
}
});

}


}

最佳答案

看起来您的 handleDrag 方法正在向每个 JPanel 添加一个新的匿名监听器,而只有一个 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());
}

});
}

关于java - 将 JPanel 拖入 JFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12694790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com