java中swing的问题,关于按钮下面也有按钮时候事件的触发

我想做一个按钮,他有着检测鼠标拖拽的事件,然后拖拽这个按钮到另外一个按钮的时候,我是打算用鼠标移动事件放在底下的按钮上的。但是,如果鼠标是在拖拽的实践中的话。下面的按钮的... 我想做一个按钮,他有着检测鼠标拖拽的事件,
然后拖拽这个按钮到另外一个按钮的时候,我是打算用鼠标移动事件放在底下的按钮上的。
但是,如果鼠标是在拖拽的实践中的话。下面的按钮的移动事件就不执行了。
这个我用了其他的变相方法实现了,但是很麻烦。
求问有没有什么,可以激活底下按钮的鼠标的移动事件的方法。。
或者一些简单点的变相解决方法。
对了。如果有时间的话,问一下有没有能直接返回一个panel或者button相对于屏幕的坐标。那个(x,y,width,height)的那个。
展开
 我来答
匿名用户
2015-01-20
展开全部
按钮是我用label模仿的,button上添加事件后没法触发底层的鼠标事件,不知道如何解决,下面是我实现的代码,拖动的动画效果还没想出好的办法, 里面有获取屏幕高宽的方法,可以实现panel居中,button相对于屏幕坐标的方法是在事件里调用e.getXOnScreen();e.getYOnScreen()这两个方法:
public class Test {

public static void main(String[] args)
{
new Test().new MyFrame();
}

class MyFrame extends JFrame{
JLabel testBtn = new JLabel("test:");
int x;//x坐标
int y;//y坐标

public MyFrame(){

Dimension ss = Toolkit.getDefaultToolkit().getScreenSize();//获取屏幕大小
//获取内边距
Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(this.getGraphicsConfiguration());
int taskBarHeight = screenInsets.bottom; //获取底部 菜单栏高度
setBounds(ss.width/10, (ss.height-taskBarHeight)/10, ss.width/5*4, (ss.height-taskBarHeight)/5*4);
setLayout(null);
testBtn.setBounds(0, 0, 150, 30);
testBtn.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));

addMouseListener(new MouseAdapter() {
boolean flag = false;
int xMax;
int xMin;
int yMax;
int yMin;
@Override
public void mousePressed(MouseEvent e) {
System.out.println("x="+e.getX()+";y="+e.getY());

xMax = testBtn.getX()+testBtn.getWidth();
xMin = testBtn.getX();
//这里加了个30是标题栏的高度,如果有目录栏,还需要加
yMax = testBtn.getY()+testBtn.getHeight()+30;
yMin = testBtn.getY();
//鼠标点下位置为按钮部分
System.out.println(e.getX()+";"+e.getY());
System.out.println(xMin+";"+xMin);
System.out.println(yMin+";"+yMin);
System.out.println(e.getX()>xMin&&e.getX()<xMax&&e.getY()<yMax&&e.getY()>yMin);
if(e.getX()>xMin&&e.getX()<xMax&&e.getY()<yMax&&e.getY()>yMin){
flag =true;
testBtn.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
testBtn.setLocation(e.getX()-testBtn.getWidth()/2, e.getY()-30-testBtn.getHeight()/2);
}else{
flag =false;
}
}
@Override
public void mouseReleased(MouseEvent e) {
if(flag ==true){
testBtn.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
testBtn.setLocation(e.getX()-testBtn.getWidth()/2, e.getY()-30-testBtn.getHeight()/2);
}
}
});

add(testBtn);
setVisible(true);
}
}

}
wh猎人
推荐于2016-08-18 · TA获得超过1125个赞
知道大有可为答主
回答量:1157
采纳率:89%
帮助的人:664万
展开全部

初步看起来是你把简单问题给复杂化了,:)

既然是拖动鼠标,那么是否是按drag和drop来处理。如果是那就走Swing的DnD处理(不过看你的意思不象)。

如果不是,那么把鼠标事件放到面板上是不是更好,然后让鼠标穿透过一个自定义控件(基于JComponet,参考JButton等来定制),然后根据鼠标的位置和控件的位置来看鼠标在哪个控件中。

下面是一个自定义控件的例子:

class MyComponent extends JComponent implements Graph {
  private String text;
  public MyComponent(String text) {
  this.text = text;
 }
 @Override
 public void paint(Graphics g) {
  g.setColor(Color.green);
  g.fillRect(0, 0, getWidth(), getHeight());
  g.setColor(Color.white);
  FontMetrics fm = g.getFontMetrics();
  Rectangle bounds = fm.getStringBounds(text, g).getBounds();
  g.drawString(text, (getWidth() - bounds.width) / 2, (getHeight() - bounds.height) / 2 + fm.getAscent() - fm.getDescent());
 }
}
this.getLocationOnScreen();// 获取屏幕坐标
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
易建议
2015-01-20 · 喜欢分享的人都容易获得幸福感~
易建议
采纳数:344 获赞数:1342

向TA提问 私信TA
展开全部
你可以讲移动方法写在需要拖拽的那个按钮事件里,然后当两个按钮重合的时候就触发移动的方法

getLocation()可以得到按钮的 x y 坐标
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2015-01-20
展开全部
拖拽事件和移动事件同时捕捉,,,,,,然后处理
追问
问题就是怎么同时捕捉。。一个按钮在上面执行拖拽事件,一个按钮在下面执行鼠标移动事件
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式