我写了一个jframe,jframe中放了一个panel,panel里面放了一个自定义label,我给jframe加载了一个事件监听,当鼠标移动到jframe上面的时候,停止,鼠标移开,继续。但是在鼠标移动到label上面的时候,发现jframe还是可以继续移动,请问如何讲jframe的事件监听同时也能够对于里面的label适用。以下是两个类的代码。import java.awt.Cursor;
import java.awt.Desktop;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.net.URI;import javax.swing.JLabel;
import javax.swing.JOptionPane;public class LinkedLabel extends JLabel implements MouseListener {
/**
 * 
 */
private static final long serialVersionUID = 1L;
private String msg;
private URI uri;
private String activeColor;
private String backColor; public String getActiveColor() {
return activeColor;
} public void setActiveColor(String activeColor) {
this.activeColor = activeColor;
} public String getBackColor() {
return backColor;
} public void setBackColor(String backColor) {
this.backColor = backColor;
} public String getMsg() {
return msg;
} public void setMsg(String msg) {
this.msg = msg;
} public LinkedLabel(String msg, URI uri) {
this.msg = msg;
this.uri = uri;
setText(msg);
this.addMouseListener(this);
} public void setText(String msg) {
super.setText("<html> <font color='blue'><u>" + msg+ "</u></font></html>");
} @Override
public void mouseClicked(MouseEvent e) {

} @Override
public void mousePressed(MouseEvent e) { } @Override
public void mouseReleased(MouseEvent e) {
try {
if (Desktop.getDesktop().isDesktopSupported()) {
Desktop.getDesktop().browse(uri);
}
} catch (Exception ex) {
JOptionPane.showConfirmDialog(this.getParent(), "系统找不到指定的文件!",
"错误", JOptionPane.DEFAULT_OPTION);
return;
}
} public URI getUri() {
return uri;
} public void setUri(URI uri) {
this.uri = uri;
} @Override
public void mouseEntered(MouseEvent e) {
this.setCursor(new Cursor(Cursor.HAND_CURSOR));
this.setText("<html> <font color='red'><u>" + msg
+ "</u></font></html>");
super.setToolTipText("您将访问:" + getMsg() + "地址:" + getUri().toString());
} @Override
public void mouseExited(MouseEvent e) {
this.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
this.setText("<html> <font color='blue'><u>" + msg
+ "</u></font></html>");
}}
import java.awt.Color;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URI;import javax.swing.JFrame;
import javax.swing.JPanel;/**
 * <b>说明:</b><br/>此类是swing实现java气泡弹出效果,为了增加显示效果,设置颜色为粉红色。
 * 该类实现无菜单栏及jframe通常的最小化最大化关闭功能。<br>
 * 该类实现启动后自动从右下方向上移动一个界面,直到完全显示完整个界面大小后,停止一段时间,然后在向下移动界面,知道整个界面完全看不见,该线程终止。<br>
 * 在整个生命周期里,如果鼠标在该气泡上方时候线程停止任何移动关闭等功能处于等待状态,当鼠标移开则继续。</p>
 * <b>时间:</b> 2013-01-28
 * @since jdk1.6
 * @author MaxWell
 *
 */
public class lableTest extends JFrame {
/**
 * 
 */
private static final long serialVersionUID = 1L;
/**
 * 可连接label
 */
private LinkedLabel ll;
/**
 * 主面板
 */
private JPanel jp;
/**
 * 显示器高
 */
final static int height = Toolkit.getDefaultToolkit().getScreenSize().height;
/**
 * 显示器宽
 */
final static int width = Toolkit.getDefaultToolkit().getScreenSize().width;
/**
 * 线程开关 默认为打开状态
 */
private static boolean ISRUN = true;
/**
 * 步长(每次移动多少个点整)
 */
private static int step ;
/**
 * 默认步长
 */
final static int defaultStep =5;
/**
 * 线程休息时间 (单位:ms)
 */
private static int sleeptimes =20;
/**
 * 构造方法
 */
public lableTest() {
/**
 * 主面板实例化
 */
jp = new JPanel();
/**
 * URI will be like this "file:///D:/本机宽带密码和网卡IP.txt" //"www.baidu.com" // "mailto:[email protected]"
 */
URI uri = URI.create("file:///D:/本机宽带密码和网卡IP.txt");
/**
 * 实例化可链接标签
 */
ll = new LinkedLabel("测试链接label", uri);
/**
 * 设置可链接标签大小
 */
ll.setSize(100, 30);
/**
 * 主面板加载可链接标签
 */
jp.add(ll);
/**
 * 主面板设置颜色为粉红色
 */
jp.setBackground(Color.pink);
/**
 * 加载主面板
 */
this.add(jp);
/**
 * 设置大小
 */
this.setSize(400, 200);
/**
 * 设置初始方位 为屏幕的右下角
 */
this.setLocation(width, height);
/**
 * 设置总是在前显示
 */
this.setAlwaysOnTop(true);
/**
 *  去掉jframe中的关闭最小化,最大化关闭和菜单栏。
 */
this.setUndecorated(true);
/**
 * 设置可见
 */
this.setVisible(true);
}
/**
 * 主要方法 对该界面的控制,向上移动,等待,向下移动,关闭,都是在这里控制。
 * @param milines(完全显示玩整个界面后,界面停留的时间)
 */
public static  void startShowing(long milines) {
/**
 * 实例化
 */
final lableTest test = new lableTest();
/**
 * 加载鼠标事件监听
 */
test.addMouseListener(new MouseAdapter() {

@Override
public void mouseEntered(MouseEvent e) {
/**
 * 设置开关状态为关闭状态
 */
ISRUN =false;
test.requestFocus();
}
@Override
public void mouseExited(MouseEvent e) {
/**
 * 设置开关状态为打开状态
 */
ISRUN =true;
test.requestFocus();
}
});
/**
 * 获取气泡的宽
 */
int sw = test.getSize().width;
/**
 * 获取气泡的高
 */
int sh = test.getSize().height;
/**
 * 临时变量
 */
int h;
/**
 * 如果设置步长,则使用步长来进行运作,否则使用默认步长。
 */
if (step==0 ) {
h =defaultStep;
}else  {
h=step;
}
/**
 * 如果显示器高度减去步长 大于等于显示器高度减去气泡的高度设置气泡的地址X坐标为:显示器的宽减去气泡的宽,Y坐标为:显示器的高减去步长
 */
while (height - h >= height-sh) {
test.setLocation(width-sw, height - h);
try {
/**
 * 每次改变坐标后停留
 */
Thread.sleep(sleeptimes);
} catch (Exception e) {
e.printStackTrace();
}
/**
 * 如果设置步长,则使用步长来进行运作,否则使用默认步长累加。
 */
if (step==0 ) {
h +=defaultStep;
}else  {
h+=step;
}
}

try {
/**
 * 如果设置步长,则使用步长来进行运作,否则使用默认步长。
 */
if (step==0 ) {
h =defaultStep;
}else  {
h=step;
}
/**
 * 显示完成后,气泡静止停留
 */
Thread.sleep(milines);
/**
 * 获取气泡的纵坐标
 */
int locationY = test.getLocationOnScreen().y;
/**
 * 如果设置步长,则使用步长来进行运作,否则使用默认步长。
 */
if (step==0 ) {
h =defaultStep;
}else  {
h=step;
}
/**
 * 如果气泡的纵坐标加上步长小于等于屏幕高度并且开关处于打开状态向下移动气泡
 */
while(locationY+h<=height){
if(ISRUN){
test.setLocation(width-sw, (locationY+h));
try{
/**
 * 每次改变坐标后停留
 */
Thread.sleep(sleeptimes);
}catch (Exception e) {
e.printStackTrace();
}

if (step==0 ) {
h +=defaultStep;
}else  {
h+=step;
}
}
}
/**
 * 气泡销毁,程序终止。
 */
test.dispose();
} catch (Exception e) {
e.printStackTrace();
}

} /**
 * @param args
 */
public static void main(String[] args) {
// 这里写延迟后要运行的代码
// lableTest.step =2;
// lableTest.sleeptimes=50;
lableTest.startShowing(3000);
}}
Swing 时间监听swingcomponents

解决方案 »

  1.   

    移动到label的时候,焦点是在frame还是label上?
      

  2.   

    这个不是焦点获得事件,理论上说焦点到了label上了
      

  3.   

    关于界面的 我都是直接用MyEclipse的swing插件 那里只需要给label加入所需要的监听器 触发事件里写的和你的jframe一样就行了
      

  4.   

    额,我是手写的,我的label需要有事件监听,frame也要有事件监听,然后就出现了以上情况。不知道如何解决了。