2012-07-02 36 views
3

我目前正在开发一个java/swing项目,并且我陷入了自定义过程。
我扩展了JToolTip并重写了paint()方法来绘制我自己的工具提示,但我无法设法删除工具提示周围的背景。Java/Swing - 工具提示矩形

这里的paint()覆盖:

/* (non-Javadoc) 
* @see javax.swing.JComponent#paint(java.awt.Graphics) 
*/ 
@Override 
public void paint(Graphics g) {  
    String text = getComponent().getToolTipText(); 

    if (text != null && text.trim().length() > 0) { 
     // set the parent to not be opaque 
     Component parent = this.getParent(); 
     if (parent != null) { 
      if (parent instanceof JComponent) { 
       JComponent jparent = (JComponent) parent; 
       if (jparent.isOpaque()) { 
        jparent.setOpaque(false); 
       } 
      } 
     } 

     // create a round rectangle 
     Shape round = new RoundRectangle2D.Float(4, 4, this.getWidth() - 1 - 8, this.getHeight() - 1 - 8, 8, 8); 

     // draw the background 
     Graphics2D g2 = (Graphics2D) g.create(); 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setColor(getBackground()); 
     g2.fill(round); 

     // draw the left triangle 
     Point p1 = new Point(4, 10); 
     Point p2 = new Point(4, 20); 
     Point p3 = new Point(0, 15); 
     int[] xs = {p1.x, p2.x, p3.x}; 
     int[] ys = {p1.y, p2.y, p3.y}; 
     Polygon triangle = new Polygon(xs, ys, xs.length); 
     g2.fillPolygon(triangle); 

     // draw the text 
     int cHeight = getComponent().getHeight(); 
     FontMetrics fm = g2.getFontMetrics(); 
     g2.setColor(getForeground()); 
     if (cHeight > getHeight()) 
      g2.drawString(text, 10, (getHeight() + fm.getAscent())/2); 
     else 
      g2.drawString(text, 10, (cHeight + fm.getAscent())/2); 

     g2.dispose(); 
    } 
} 

这是我想删除(白色)背景:
enter image description here

我OSX下运行Java 1.7.0_05。

+1

是不是通过'super.paint'得出? – dacwe

+0

为了更快得到更好的帮助,请发布[SSCCE](http://sscce.org/)。 –

+0

无关:_never-ever_在paint/Component中更改组件状态 – kleopatra

回答

0

这可能是因为您在之后将父母设置为不透明,致电super.paint。 另外,你有没有在JToolTip上调用setOpaque? 最后,你可以在每个战平信息addNotify,而不是执行的代码做的一切:

public void addNotify() { 
    super.addNotify(); 
    setOpaque(false); 
    Component parent = this.getParent(); 
    if (parent != null) { 
     if (parent instanceof JComponent) { 
      JComponent jparent = (JComponent) parent; 
      jparent.setOpaque(false); 
     } 
    } 
} 
+0

感谢@marco,但这并没有解决问题。 无论如何,我现在使用addnotify()来设置父级的不透明值,谢谢! –