[swing]拖放JPanel

jiangshachina 2009-09-03 11:13:08
界面中有若干个JPanel,想通过鼠标拖放来改变它们的相对位置,即进行重新布局。
请问如何实现?

不一定要给出代码,提出好的思路即可得分 *_*
...全文
245 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
yunhaifeiwu 2011-11-02
  • 打赏
  • 举报
回复
能够实现拖放,前题是要用netbeans的绝对布局。(AbsoluteConstraints之类的在netbeans安装路径下)以下是完整代码。
使用类
==========================

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package fdragpanel;

import java.awt.Color;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import org.netbeans.lib.awtextra.AbsoluteLayout;
import org.netbeans.lib.awtextra.AbsoluteConstraints;
import javax.swing.JLabel;
import javax.swing.JTextArea;

/**
*
* @author cloud
*/
public class FDragPanel extends JPanel {
Point p;

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {

createPanel();





}
});
}

public static void createPanel() {
JFrame f = new JFrame("Wallpaper");

JPanel p = new JPanel();
p.setLayout(new AbsoluteLayout());

FDragPanel fp=new FDragPanel();
FDropMouseListener fml=new FDropMouseListener(p);
fp.addMouseListener(fml);
fp.setBackground(Color.red);



p.add(fp,new AbsoluteConstraints(20, 20, 100, 80));

f.add(p);
// f.add (jlayer);



f.setSize(400, 300);
f.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
f.setLocationRelativeTo (null);
f.setVisible (true);
}

}

===============为绝对布局而打造的拖放鼠标适配器类

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package fdragpanel;

import java.awt.Component;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import java.lang.Math;
import javax.swing.JPanel;
import org.netbeans.lib.awtextra.AbsoluteConstraints;

/**
*
* @author cloud
*/
public class FDropMouseListener extends MouseAdapter {
private Point p;
private JPanel c ;
public FDropMouseListener(JComponent c ){
this.c=(JPanel) c;
}

@Override
public void mousePressed(MouseEvent e){
p=new Point(e.getX(),e.getY());
// JOptionPane.showMessageDialog(c, "按我了");
}

@Override
public void mouseReleased(MouseEvent e){
Component c1 = e.getComponent();

Point p1=new Point(e.getX(),e.getY());


int x= c1.getLocation().x+p1.x-p.x;
int y=c1.getLocation().y+p1.y-p.y;


c.add(c1,new AbsoluteConstraints(x,y,c1.getWidth(),c1.getHeight()));

c.repaint();
c.revalidate();


}
}
duanshaochu 2009-11-06
  • 打赏
  • 举报
回复
学习中,期待答案。
jiangshachina 2009-09-10
  • 打赏
  • 举报
回复
> 可以用布局管理器哦!!难到 不可以吗!!呵呵呵
布局管理器应该是要用的,因为还是是要靠Layout Manager来重新布局UI Component。
wgmkss 2009-09-05
  • 打赏
  • 举报
回复
可以用布局管理器哦!!难到 不可以吗!!呵呵呵
karlyuan2008 2009-09-05
  • 打赏
  • 举报
回复
期待答案
Miracle1216 2009-09-04
  • 打赏
  • 举报
回复
仿照JInternalFrame
ctlu2ct2t 2009-09-04
  • 打赏
  • 举报
回复
关注学习!
jiangshachina 2009-09-04
  • 打赏
  • 举报
回复
希望大家畅所欲言,我也将继续研究。
jiangshachina 2009-09-03
  • 打赏
  • 举报
回复
我只是希望能更灵活些。
比如,用户可能会调整一下某些容器之间的位置。
dajiadebeibei9 2009-09-03
  • 打赏
  • 举报
回复
用布局管理器满足不了你的布局方式吗?
sforiz 2009-09-03
  • 打赏
  • 举报
回复
在能设计JPanel的IDE中试试,用户能随意的改变JPANEL的位置不知道好不好实现,这毕竟不是ASP.NET中的WebParts
nj_dobetter 2009-09-03
  • 打赏
  • 举报
回复
监听mouse press和mouse drag事件
Miracle1216 2009-09-03
  • 打赏
  • 举报
回复
还没试过,研究一下
安小寰 2009-09-03
  • 打赏
  • 举报
回复
我想能不能用FlowLayout布局器然后通过一个线程的方式监听用户的鼠标动作.
大概下面一个流程:(线程内监听操作)

1.判定用户鼠标当前位置,并且监听鼠标是否为按下状态
2.根据鼠标位置判定当前悬停swing组件对象,若没有可移动组件返回false
4.读取用户最后释放鼠标位置,生成Point对象point
3.panel.setPreferredSize(new Dimension(point)); //通过设定组件位置对组件进行操作

我的构想是这样的,不过具体实现起来可能不行,因为这样的情况很容易造成组件重叠并且移动过程不可能实现像window移动文件夹一样的动态显示.
windforcecn 2009-09-03
  • 打赏
  • 举报
回复
定了一个Layout,然后此layout上的各个面板可以换位置,你看eclipse的控件就可以拖动位置
jiangshachina 2009-09-03
  • 打赏
  • 举报
回复
> 不能实现~~
不可能吧。
在JTable中,用户就可以通过鼠标拖放重新安排Column的顺序。
imasmallbird 2009-09-03
  • 打赏
  • 举报
回复
不能实现~~

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧