S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

LayeredPaneとかレイヤとか

半透明にもできる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みたい。