接着 帖子“如何实现这个Tips”再问我还是坚信Swing可以作出一切的图形效果大家千万不要让我的信仰破灭啊,请坚定我信仰吧
请帮我解决此问题
给出思路也可以问题如下
*****************************************************************************
我一直认为Swing可以作出所有我们想要的图形,不过下面的这个我是实现不了了。。请高人出手相助!!!
我们在用qq时,如果我们没有输入东西,那么当我们点击“发送”时,就会有个Tip告诉我们“发送内容不可以为空”
如何作出这样的Tips,最重要的是我要求这个Tips的外形也得像qq上的那种形状的我觉得用Swing肯定可以作出这样的效果的。
*****************************************************************************呼吁牛人出现
强烈的呼吁牛人出现,解决这个小问题请留住一个 javaSwing 爱好者的热情
请坚定我对 javaSwing 的信仰

解决方案 »

  1.   

    可以呀
    使用Tooltip
    自己修改她的外观就可以做到吧
      

  2.   

    用JWindow组件,定制边框,背景,你想怎么做就怎么做。
      

  3.   

    用JWindow可以作到啊好好看看!!!
      

  4.   

    你所描述的是不是这个样子?
    开始用继承JToolTip的方法做了一个,但是由于JToolTip不能设置透明,所以不规则形状做不出来,只好放弃,现在是继承JPanel后用层来实现的。import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.FontMetrics;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Insets;
    import java.awt.Point;
    import java.awt.Polygon;
    import java.awt.RenderingHints;
    import java.awt.Shape;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.geom.Area;
    import java.awt.geom.RoundRectangle2D;import javax.swing.Box;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLayeredPane;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    import javax.swing.text.View;import com.sun.java.swing.SwingUtilities2;/**
     * 用层来模拟ToolTip的部分功能,可以做出非规则形状
     * @author 五斗米
     * http://blog.csdn.net/mq612
     */
    public class Test {
    private JFrame frame = null; private Box box = null; // 为了将MyButton放到一个合适的位置,采用这个比较麻烦的Box来管理 private MyButton button = null; private MyToolTip tip = null; public Test() {
    frame = new JFrame("MyToolTip");
    box = Box.createVerticalBox();
    button = new MyButton("Button");
    tip = new MyToolTip(frame.getLayeredPane(), "向Java战友问好!");
    button.setMyToolTip(tip);
    box.add(Box.createVerticalGlue());
    Box box_ = Box.createHorizontalBox();
    box_.add(Box.createHorizontalGlue());
    box_.add(button);
    box_.add(Box.createHorizontalGlue());
    box.add(box_);
    box.add(Box.createVerticalGlue());
    frame.getContentPane().add(box, BorderLayout.CENTER);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(360, 220);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    } public static void main(String args[]) {
    new Test();
    } /**
     * 继承JButton,实现了MouseListener接口,当鼠标移动到该按钮上,显示MyToolTip
     * @author 五斗米
     * http://blog.csdn.net/mq612
     */
    class MyButton extends JButton implements MouseListener {
    private static final long serialVersionUID = -6373246716080645309L; private MyToolTip tip = null; // JButton的构造很多,都可以适用
    public MyButton(String text) {
    super(text);
    this.addMouseListener(this);
    } // 设置MyToolTip
    public void setMyToolTip(MyToolTip tip) {
    this.tip = tip;
    } public MyToolTip getMyToolTip() {
    return tip;
    } public void mouseClicked(MouseEvent e) {
    } // 当鼠标进入时显示,也可以加一个定时器来延时显示
    public void mouseEntered(MouseEvent e) {
    Point p = getLocationOnScreen();
    SwingUtilities.convertPointFromScreen(p, frame.getContentPane());
    tip.setLocation(new Point(p.x - tip.getWidth() + 10, p.y - tip.getHeight() + 10));
    tip.setVisible(true);
    } // 鼠标离开即消失
    public void mouseExited(MouseEvent e) {
    tip.setVisible(false);
    } public void mousePressed(MouseEvent e) {
    } public void mouseReleased(MouseEvent e) {
    } } /**
     * 继承JPanel,因为可以设置透明,所以我们很容易就可以做出不规则形状来,但是很遗憾,它的缺点是位置不能超出JFrame,否则超出部分无法显示
     * @author 五斗米
     * http://blog.csdn.net/mq612
     */
    class MyToolTip extends JPanel { private static final long serialVersionUID = -1405474493135741335L; private String text = null; // 将要显示的字符串 private JLayeredPane lp = null; // 我们要用到的层 public MyToolTip(JLayeredPane lp, String text) {
    this.lp = lp;
    this.text = text;
    this.setOpaque(false);
    lp.add(this, new Integer(JLayeredPane.POPUP_LAYER)); // 将组件放在弹出层中,这样就可以浮现在其它组件之上
    this.setSize(this.getPreferredSize());
    this.setVisible(false); // 设置组件不可视
    } public void setText(String text) {
    this.text = text;
    this.setSize(this.getPreferredSize()); // 改变文字后需要重新计算Size
    } public String getText() {
    return text;
    } public JLayeredPane getLp() {
    return lp;
    } public void setLp(JLayeredPane lp) {
    this.lp = lp;
    } // 画背景和文字
    protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d
    .setRenderingHint(RenderingHints.KEY_ANTIALIASING,
    RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setColor(new Color(205, 235, 235)); // 背景颜色
    g2d.fill(this.getArea(this.getSize()));
    g2d.setColor(new Color(40, 130, 180)); // 文字颜色
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
    RenderingHints.VALUE_ANTIALIAS_OFF);
    g2d.drawString(text, 25 / 2, (getHeight() - 10) / 2 + 5);
    } // 画边框
    protected void paintBorder(Graphics g) {
    super.paintBorder(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d
    .setRenderingHint(RenderingHints.KEY_ANTIALIASING,
    RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setColor(new Color(95, 145, 145)); // 边线颜色
    g2d.draw(this.getArea(this.getSize()));
    } /**
     * 返回适合的Size
     */
    public Dimension getPreferredSize() {
    Font font = getFont();
    FontMetrics fm = getFontMetrics(font);
    Insets insets = getInsets();
    Dimension prefSize = new Dimension(insets.left + insets.right, insets.top
    + insets.bottom);
    if ((text == null) || text.equals("")) {
    text = "";
    } else {
    View v = (this != null) ? (View) getClientProperty("html") : null;
    if (v != null) {
    prefSize.width += (int) v.getPreferredSpan(View.X_AXIS);
    prefSize.height += (int) v.getPreferredSpan(View.Y_AXIS);
    } else {
    prefSize.width += SwingUtilities2.stringWidth(this, fm, text) + 25; // 25为多加的部分
    prefSize.height += fm.getHeight() + 10; // 10为多加的部分
    }
    }
    return prefSize;
    } // 返回画图所需要的区域
    private Area getArea(Dimension dim) {
    Shape r = new RoundRectangle2D.Float(0, 0, dim.width - 1, dim.height - 10, 5, 5); // 圆角矩形
    Area area = new Area(r);
    Polygon polygon = new Polygon(); // 多边形
    polygon.addPoint(dim.width - 15, dim.height - 10);
    polygon.addPoint(dim.width - 5, dim.height - 10);
    polygon.addPoint(dim.width, dim.height);
    area.add(new Area(polygon)); // 合并
    return area; // 返回
    } }}
      

  5.   

    to mq612(五斗米)斑竹果然是高手
    厉害厉害,真是厉害感谢,万分感谢前几天搜索你的名字,想找到你的blog,不过没有找到
    现在终于知道你的blog了再次感谢 相助