半透明にもできるToolTipがあったんで、それでお勉強。
調べてたこと、ができるのがわかった。
でも、JMFのカメラ画像のレイヤ化(映像にフィルタを掛ける)はNGっぽい。
JMFのコンポーネントが、ネイティブで直接映像を表示してる?
SwingやAWTのコントロール下で映像を描画していない?という感じ。
まぁ、その通りの動作であれば、それでそういう動きになるわな。
それをkoma2さんに言うと、「JMFの映像を受けて自分で描画したら?」とな。
むむむ…
とりあえずToolTipのテストコード(JDK1.5.0_11)。
#Eclipseだと中国語のソースコードって文字コードで引っ掛かるのね
package test; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.RenderingHints; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.geom.RoundRectangle2D; import java.util.StringTokenizer; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLayeredPane; import javax.swing.JPanel; import javax.swing.border.LineBorder; public class OpaqueToolTipExample extends JFrame { private static final long serialVersionUID = -1971060781012034973L; // ボタン private JButton button = null; // デフォルトコンストラクタ public OpaqueToolTipExample() { init(); } // 初期処理 public void init() { // ToolTip HalfOpaqueToolTip tooltip = new HalfOpaqueToolTip("ToolTipです", new Color(250, 250, 200 ), Color.RED, Color.BLACK, NOT_OPAQUE, this); // ボタン button = new JButton(" swing "); button.addMouseListener(tooltip); this.setLayout(new FlowLayout()); this.add(button); this.setSize(360, 200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLocationRelativeTo(null); this.setVisible(true); } // main public static void main(String args[]) { new OpaqueToolTipExample(); } // ToolTip - 無透過 public final static int NOT_OPAQUE = 0; // ToolTip - 半透過 public final static int HALF_OPAQUE = 1; // ToolTip - 透過 public final static int OPAQUE = 2 ; // ToolTip - 透過(枠なし) public final static int COMPLETE_OPAQUE = 3; // ToolTipクラス private class HalfOpaqueToolTip extends JPanel implements MouseListener { private static final long serialVersionUID = -3336804357119026957L; private Color backGroundCol = null; private Color foregroundColorCol = null; private String content = null; private int opaqueT = 0; private JFrame frame = null; // コンストラクタ public HalfOpaqueToolTip(String tooltipContent , Color backGroundColor , Color foregroundColor , Color borderColor , int opaqueType , JFrame frame) { content = tooltipContent; backGroundCol = backGroundColor; foregroundColorCol = foregroundColor; opaqueT = opaqueType; int fristRowIndex = tooltipContent.indexOf("\n"); String tooltipStr = ""; if (fristRowIndex > 0) { tooltipStr = tooltipContent.substring(0, tooltipContent.indexOf(" \n ")); } else { tooltipStr = tooltipContent; } this.setSize(tooltipStr.length() * this.getFont().getSize() + 20 , new StringTokenizer(tooltipContent, " \n ").countTokens() * 20 + 15); this .setOpaque( false ); if (opaqueType != COMPLETE_OPAQUE) { this.setBorder(new LineBorder(borderColor)); } this.setVisible(false); frame.getLayeredPane().add(this, JLayeredPane.POPUP_LAYER); this.frame = frame; } // 描画 protected void paintComponent(Graphics g) { super .paintComponent(g); Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setColor(backGroundCol); if (opaqueT == HALF_OPAQUE) { AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 60 / 100.0F); g2d.setComposite(composite); g2d.fill(new RoundRectangle2D.Float(0, 0, this.getWidth(), this.getHeight(), 0, 0)); } else if (opaqueT == NOT_OPAQUE) { AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 100 / 100.0F); g2d.setComposite(composite); g2d.fill(new RoundRectangle2D.Float(0, 0, this.getWidth(), this.getHeight(), 0, 0)); } g2d.setColor(foregroundColorCol); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); StringTokenizer contentTokenizer = new StringTokenizer(content, " \n "); int contentStartY = 20; while (contentTokenizer.hasMoreElements()) { g2d.drawString(contentTokenizer.nextToken(), 10, contentStartY); contentStartY = contentStartY + 20; } } // マウスカーソルがボタンに入った public void mouseEntered(MouseEvent e) { Point p = e.getPoint(); this.setLocation(p.x + button.getX(), p.y + button.getY()); this .setVisible( true ); } // マウスカーソルがボタンから外れた public void mouseExited(MouseEvent e) { this .setVisible( false ); } public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } } }
■参考サイト
swing storm - swing components−半透明ToolTip http://www.blogjava.net/azure/archive/2007/03/13/103609.html
Javaは6.0みたい。