java中swing的问题,关于按钮下面也有按钮时候事件的触发
发布网友
发布时间:2022-05-16 01:46
我来回答
共4个回答
热心网友
时间:2023-10-08 20:37
按钮是我用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);
}
}
}
热心网友
时间:2023-10-08 20:37
初步看起来是你把简单问题给复杂化了,:)
既然是拖动鼠标,那么是否是按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();// 获取屏幕坐标
热心网友
时间:2023-10-08 20:38
你可以讲移动方法写在需要拖拽的那个按钮事件里,然后当两个按钮重合的时候就触发移动的方法
getLocation()可以得到按钮的 x y 坐标
热心网友
时间:2023-10-08 20:38
拖拽事件和移动事件同时捕捉,,,,,,然后处理追问问题就是怎么同时捕捉。。一个按钮在上面执行拖拽事件,一个按钮在下面执行鼠标移动事件