Topic: 请问一个给label加超级链接的问题,有点小bug,谁能帮忙解决下。

  Print this page

1.请问一个给label加超级链接的问题,有点小bug,谁能帮忙解决下。 Copy to clipboard
Posted by: michaelyung
Posted on: 2004-10-09 11:48

在一个panel上添加label,给label添加链接。
鼠标移到上面时显示为蓝色,否则就显示为黑色。
现在基本通过。点击也可以打开网页。
但有个小bug,发现鼠标上下through字符时,颜色变化很好。
左右through时,发现就不行了。
谁能帮我看看,我实在不知道哪个地方导致的问题。
谢谢各位!!


import java.awt.*;
import java.awt.event.*;
import java.awt.font.*;
import java.awt.geom.*;
import javax.swing.*;
import java.text.*;

public class MouseMove{
public static void main(String[] args){
MouseFrame frame = new MouseFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();
}
}

/*
* JFrame
* @author yung
*/
class MouseFrame extends JFrame{
public MouseFrame(){
setTitle("MouseTest");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

MousePanel panel = new MousePanel();
Container contentPane = getContentPane();
contentPane.add(panel);
}

public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 200;
}

/*
* JPanel
* @author yung
*/
class MousePanel extends JPanel{
public MousePanel(){
label = new HLabel(message,url);
label.setFont(new Font("Simsun",20,20));
add(label,BorderLayout.CENTER);
}

private HLabel label;
private String message="Hello Bupt";
private String url="http://www.bupt.edu.cn";
}

/*
* HLabel
* @author yung
*/
class HLabel extends JLabel{
private String url; //链接网址
private Rectangle bounds; //字符区域
boolean flag = true; //判断鼠标在字符区域内的标志

/*
* constructor
*/
public HLabel(String text,String uurl){
super(text);
url=uurl;
setHorizontalAlignment(SwingConstants.CENTER);
bounds=new Rectangle();
}

//当点击链接时打开网页
public void openIt() {
try {
Runtime.getRuntime().exec("mozilla "+url);
}catch (Exception e) {
JOptionPane.showMessageDialog(this,e.getMessage(),"Error",JOptionPane.ERROR_MESSAGE);
}
}


//当鼠标移到链接上字体变为蓝色,然后重绘,鼠标变为手形
public void blue(){
flag = false;
repaint();
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
}

//鼠标在其他地方,鼠标为默认。
public void black(){
flag = true;
repaint();
setCursor(Cursor.getDefaultCursor());
}



//paint
public void paint(Graphics g) {
super.paintBorder(g);//括号里是g,不知怎么显示不出来

Graphics2D g2=(Graphics2D)g;

//获取label上字符属性
Font f=getFont();
AttributedString ats=new AttributedString(this.getText());
ats.addAttribute(TextAttribute.FONT, f);
ats.addAttribute(TextAttribute.UNDERLINE,TextAttribute.UNDERLINE_ON);
AttributedCharacterIterator iter=ats.getIterator();
FontRenderContext frc=g2.getFontRenderContext();

TextLayout tl=new TextLayout(iter, frc);

//重绘时根据flag来判断是变为蓝色还是黑色
if(flag==true){
g2.setColor(Color.black);
}else{
g2.setColor(Color.BLUE);
}

//获取字符区域
Rectangle rect=tl.getBounds().getBounds();
Rectangle total=this.getBounds();
bounds.x=(total.width-rect.width)/2;
bounds.y=(total.height-rect.height)/2;
bounds.width=rect.width;
bounds.height=rect.height;
tl.draw(g2,bounds.x,bounds.y+rect.height);

//添加监听器
addMouseListener(new MouseHandler());
addMouseMotionListener(new MouseMotionHandler());
}


//查找鼠标所在点是否在字符的区域内
public Rectangle2D find(Point2D p){
if (bounds.contains(p)) return bounds; //括号里是p,也没显示出来
return null;
}

//鼠标点击的事件处理
private class MouseHandler extends MouseAdapter {
public void mouseClicked(MouseEvent event){
if(SwingUtilities.isLeftMouseButton(event)) {
if(event.getClickCount()==1) {
if(find(event.getPoint())!=null) {
openIt();
}
}
}
}
}

//鼠标移动的事件处理
private class MouseMotionHandler implements MouseMotionListener{
public void mouseMoved(MouseEvent event){
if (find(event.getPoint()) == null){
black(); //调用默认鼠标方法

}
else{
blue(); //调用显示链接为蓝色方法

}
}

public void mouseDragged(MouseEvent event){

}
}
}

2.Re:请问一个给label加超级链接的问题,有点小bug,谁能帮忙解决下。 [Re: michaelyung] Copy to clipboard
Posted by: michaelyung
Posted on: 2004-10-12 20:47

自己顶一下。
有人知道吗,我还是解决不了。不明白什么问题。

3.Re:请问一个给label加超级链接的问题,有点小bug,谁能帮忙解决下。 [Re: michaelyung] Copy to clipboard
Posted by: kavinwang
Posted on: 2004-10-13 13:14

两个方面:
1,不必在paint中每次都执行
//添加监听器
addMouseListener(new MouseHandler());
addMouseMotionListener(new MouseMotionHandler());
在构造中设置一次就行了

2,不必添加MouseMotionListener,只要在MouseHandler中实现mouseEnter和MouseExit两个方法,在mouseEnter中进行blue,在MouseExit中进行black就OK了

4.Re:请问一个给label加超级链接的问题,有点小bug,谁能帮忙解决下。 [Re: michaelyung] Copy to clipboard
Posted by: michaelyung
Posted on: 2004-10-13 14:10


嗯。果然可以。
谢谢你啊。

不过为什么之前不使用mouseEntered mouseExited,而采用监听鼠标是否
在label区域内来判断变化就不可呢。

就是说为什么会有那样的bug啊?

或许比较弱,不过想把原理搞清楚。谢谢指点一下啊。

5.Re:请问一个给label加超级链接的问题,有点小bug,谁能帮忙解决下。 [Re: michaelyung] Copy to clipboard
Posted by: kavinwang
Posted on: 2004-10-13 14:16

没明白你的问题,能说清楚点吗?

6.Re:请问一个给label加超级链接的问题,有点小bug,谁能帮忙解决下。 [Re: michaelyung] Copy to clipboard
Posted by: michaelyung
Posted on: 2004-10-14 09:56

就是使用我的那种方法为什么会有bug?


我现在明白你所用的方法,在label上添加mouselistener,鼠标entered和鼠标exited都能调用某个事件处理。
而我的方法是通过判断鼠标是否在label的座标区域内来调用事件处理的。例如通过在Rectangle内find鼠标所在座标点来判断。


不知我讲清楚没,我当初设计就是用这个方法来设计的。非常感谢。

7.Re:请问一个给label加超级链接的问题,有点小bug,谁能帮忙解决下。 [Re: michaelyung] Copy to clipboard
Posted by: kavinwang
Posted on: 2004-10-14 10:05

鼠标事件的使用范围和方法有一定的标准,这个标准是可以跨越的。关于这些方法说起来可能有点多,建议你多看一些这个方面的资料,如果你能够理解DnD在java中的实现,对鼠标事件的理解可能会更深,另外鼠标事件的处理你也可以看一些swing中对鼠标的处理方面的资料。

8.Re:请问一个给label加超级链接的问题,有点小bug,谁能帮忙解决下。 [Re: michaelyung] Copy to clipboard
Posted by: michaelyung
Posted on: 2004-10-14 10:11

嗯。好的。我会去看下。
因为我平时研究Swing比较少,但实际应用中有时也要用到,所以只是知道一些,不是太深入。谢谢你啊。有机会再向你请教。
非常感谢阿。

9.Re:请问一个给label加超级链接的问题,有点小bug,谁能帮忙解决下。 [Re: michaelyung] Copy to clipboard
Posted by: kavinwang
Posted on: 2004-10-14 10:13

不用客气,大家互相学习!


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923