java中swing的问题,关于按钮下面也有按钮时候事件的触发
我想做一个按钮,他有着检测鼠标拖拽的事件,然后拖拽这个按钮到另外一个按钮的时候,我是打算用鼠标移动事件放在底下的按钮上的。但是,如果鼠标是在拖拽的实践中的话。下面的按钮的...
我想做一个按钮,他有着检测鼠标拖拽的事件,
然后拖拽这个按钮到另外一个按钮的时候,我是打算用鼠标移动事件放在底下的按钮上的。
但是,如果鼠标是在拖拽的实践中的话。下面的按钮的移动事件就不执行了。
这个我用了其他的变相方法实现了,但是很麻烦。
求问有没有什么,可以激活底下按钮的鼠标的移动事件的方法。。
或者一些简单点的变相解决方法。
对了。如果有时间的话,问一下有没有能直接返回一个panel或者button相对于屏幕的坐标。那个(x,y,width,height)的那个。 展开
然后拖拽这个按钮到另外一个按钮的时候,我是打算用鼠标移动事件放在底下的按钮上的。
但是,如果鼠标是在拖拽的实践中的话。下面的按钮的移动事件就不执行了。
这个我用了其他的变相方法实现了,但是很麻烦。
求问有没有什么,可以激活底下按钮的鼠标的移动事件的方法。。
或者一些简单点的变相解决方法。
对了。如果有时间的话,问一下有没有能直接返回一个panel或者button相对于屏幕的坐标。那个(x,y,width,height)的那个。 展开
4个回答
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);
}
}
}
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);
}
}
}
展开全部
初步看起来是你把简单问题给复杂化了,:)
既然是拖动鼠标,那么是否是按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();// 获取屏幕坐标
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你可以讲移动方法写在需要拖拽的那个按钮事件里,然后当两个按钮重合的时候就触发移动的方法
getLocation()可以得到按钮的 x y 坐标
getLocation()可以得到按钮的 x y 坐标
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2015-01-20
展开全部
拖拽事件和移动事件同时捕捉,,,,,,然后处理
追问
问题就是怎么同时捕捉。。一个按钮在上面执行拖拽事件,一个按钮在下面执行鼠标移动事件
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询