TITLE:JLayeredPaneで小さなウインドを表示

JLayeredPaneで小さなウインドを表示

編集者:Taka
作成日:2005-03-24
更新日:2023-03-03 (金) 11:55:53

概要

背景画像を表示可能な JLayeredPane に付箋紙を表示するサンプル。

サンプルコード

/** 2005/03/24
    JLayeredPane のサンプル
    背景画像を表示する JFrame に JLayeredPane を使って付箋紙を表示する。
    ヘッダー部分のクリックで付箋紙の上下入れ替えを、ドラッグで付箋紙の移
    動を行う。

◎ノート
・Font は環境に合わせて適当に変えるか、コメントアウトして下さい。
・背景画像 bg.gif を用意して下さい。画像がなくても背景なしで動作します。
・テスト WindowsXP/J2SE 5.0
 */
import java.io.File;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.BorderFactory;
import javax.swing.border.Border;

public class TestJLayeredPane1 extends JFrame {

	Font FONT = new Font("MS ゴシック", Font.PLAIN, 12);
	String BG_IMG = "bg.gif";

	public static void main(String[] argv){
		TestJLayeredPane1 f = new TestJLayeredPane1();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
		f.setPreferredSize( new Dimension(700,500));
		f.pack();
		f.setVisible(true);
	}

	static final int BACKLAYER = 1;
	static final int FORELAYER = 2;

	BGImageLayeredPane layerPane;

	/** */
	public TestJLayeredPane1(){
		super("TestJLayeredPane1");

		//背景画像
		Image img = null;
		File f = new File(BG_IMG);
		if (f.isFile()){
			ImageIcon icon = new ImageIcon(BG_IMG);
			img = icon.getImage();
		}

		layerPane = new BGImageLayeredPane();
		layerPane.setImage(img);

		for (int i=0; i<7; i++){
			JPanel p = createPanel(i);
			p.setLocation(i*70 + 20, i*50 + 15);
			layerPane.add(p, BACKLAYER);
		}
		setContentPane(layerPane);
	}

	int[] colors = { 0xdddddd, 0xaaaaff, 0xffaaaa, 0xaaffaa, 0xffffaa, 0xffaaff, 0xaaffff };

	Color getColor(int i, float f){
		int b = (int)((i & 0xff) * f);
		i = i >> 8;
		int g = (int)((i & 0xff) * f);
		i = i >> 8;
		int r = (int)((i & 0xff) * f);
		return new Color(r,g,b);
	}


	JPanel createPanel(int i){

		String s = "<html><font color=#333333>ヘッダーだよん:"+ i +"</font></html>";
		JLabel label = new JLabel(s);
		label.setFont(FONT);
		label.setOpaque(true);
		label.setHorizontalAlignment(SwingConstants.CENTER);
		label.setBackground( getColor(colors[i], 0.85f));
		Border border1 = BorderFactory.createEmptyBorder(4, 4, 4, 4);;
		label.setBorder(border1);

		JTextArea text = new JTextArea();
		text.setBackground( new Color(colors[i]));
		text.setMargin(new Insets(4,4,4,4));
		text.setLineWrap(true);

		JPanel p = new JPanel();

		Color col = getColor(colors[i], 0.5f);
		Border border = BorderFactory.createLineBorder(col, 1);
		p.setBorder(border);

		//ウインド移動用の処理
		DragMouseListener  li = new DragMouseListener(p);
		p.addMouseListener(li);
		p.addMouseMotionListener(li);

		p.setLayout( new BorderLayout());
		p.add(label, BorderLayout.NORTH);
		p.add(text, BorderLayout.CENTER);
		p.setSize( new Dimension(150, 120));
		return p;
	}

	//タイトル部分のマウスクリックでパネルを最上位にもってくる。ドラッグで移動。
	class DragMouseListener implements MouseListener, MouseMotionListener {
		Point origin;
		JPanel panel;

		DragMouseListener(JPanel p){
			panel = p;
		}
		public void mousePressed(MouseEvent e){
			origin = new Point( e.getX(), e.getY());
			//選択された部品を上へ
			layerPane.moveToFront(panel);
		}
		public void mouseDragged(MouseEvent e){
			if (origin == null)
				return;

			//ずれた分だけ JPanel を移動させる
			int dx = e.getX() - origin.x;
			int dy = e.getY() - origin.y;
			Point p = panel.getLocation();
			panel.setLocation( p.x + dx, p.y + dy);
		}

		public void mouseClicked(MouseEvent e) {}
		public void mouseEntered(MouseEvent e) {}
		public void mouseExited(MouseEvent e) {}
		public void mouseReleased(MouseEvent e) {}
		public void mouseMoved(MouseEvent e) {}
	}

	//背景画像を描画する JLayeredPane
	class BGImageLayeredPane extends JLayeredPane {

		BGImageLayeredPane(){
		}

		void setImage(Image img){
			bgImage = img;
		}
		Image bgImage;

		//override
		public void paint(Graphics g) {
			if (bgImage != null){
				int imageh = bgImage.getHeight(null);
				int imagew = bgImage.getWidth(null);

				Dimension d = getSize();
				for (int h=0; h<d.getHeight(); h += imageh){
					for (int w=0; w<d.getWidth(); w += imagew){
						g.drawImage(bgImage, w, h, this);
					}
				}
			}
			super.paint(g);
		}
	}
}

解説

JLayeredPane のサブクラス BGImageLayeredPane で背景画像を描画しています。 JLayeredPane に createPanel(int i) で作った付箋紙の部品を add し、マウスリスナーでクリックやドラッグを検出しています。

参考リンク

コメント

ほかのページで参考になりました。お礼にサンプルを差し上げます。 不都合でしたら編集・削除してください。画像と zip のアップロードが わからないので、ソースを全部のせてあります・・・あしからず。

  • 下のアイコンからファイルの添付ができるのですが、広告のせいかうまく表示や取得ができなくなっています。いい方法がないかちょっと調べてみます。 -- terai
  • 添付できるようにしてみました。codehighlightプラグインとかも入れたいのですが、今後の課題です。 -- terai
  • あと、言い忘れてましたが、不都合は無いです*1。今後ともよろしくお願いします。 -- terai