透明なお絵かきウィンドウ

```java

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
/*メインのclass
 *
 */
public class Oekaki {
	public static void main(String[] args)
	{
		JFrame.setDefaultLookAndFeelDecorated(true);//ロックアンドフィール設定
		final Jframe body = new Jframe();
		body.setVisible(true);//可視化
		body.setBackground(new Color(0,0,0,1));//透明度だけ設定
	}
}
/*本体のclass
 *
 */

class Jframe extends JFrame implements ActionListener{
	private final GPanel evPanel;
    public Jframe(){
		/*基本設定*/
		super("お絵かき");
		this.setSize(700, 600);//フレーム作り
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//終了設定
		evPanel= new GPanel();
		this.add( evPanel, BorderLayout.CENTER);//絵を書くイベントを真ん中に配置
		create_button();//ボタンを右側に配置。
		this.setBackground(new Color(0,0,0,1));//後ろを透明に
	}

	/*パネル作り*/
	void create_button(){
		final JPanel right_panel = new JPanel();//右の空間作り
		final JButton all_delete = new JButton("消す");//消去ボタン
		final JButton red_button = new JButton("赤");
		final JButton break_button = new JButton("黒");
		final JButton white_button = new JButton("白");
		all_delete.addActionListener(this);//消去イベント追加
		all_delete.setActionCommand("all_delete");//イベントに渡すための名前
		red_button.addActionListener(this);//赤にするイベント追加
		red_button.setActionCommand("red");//イベントに渡すための名前
		break_button.addActionListener(this);//赤にするイベント追加
		break_button.setActionCommand("break");//イベントに渡すための名前
		white_button.addActionListener(this);//赤にするイベント追加
		white_button.setActionCommand("white");//イベントに渡すための名前
		right_panel.setLayout(new GridLayout(4,1));//レイアウトマネージャー設定
		//すべてのボタンの配置　
		right_panel.add(all_delete);//消すボタン配置
		right_panel.add(red_button);//赤のボタンを配置
		right_panel.add(break_button);//黒のボタンを配置
		right_panel.add(white_button);//白のボタンを配置
		this.getContentPane().add(right_panel,BorderLayout.EAST);//パネルを右に配置
	}
	/*ボタンイベント作成*/
	public void actionPerformed(ActionEvent e)
	{
		//System.out.println("ボタン押されたよ");//確認用
		evPanel.ovarall_x(getSize().width);//フレームのサイズを取得
		evPanel.ovarall_y(getSize().height);
		String event_name = e.getActionCommand();//飛んできたイベントのオブジェクトを取得

		if(event_name.equals("all_delete"))//飛んできた名前のオブジェクトと比較
		{
			evPanel.if_root();//flagをfalseにする
		}
		if(event_name.equals("red"))//飛んできた名前のオブジェクトと比較
		{				evPanel.color_change_red();//色を赤にする
		}
		if(event_name.equals("break"))//飛んできた名前のオブジェクトと比較
		{
			evPanel.color_change_break();//色を黒にする
		}
		if(event_name.equals("white"))//飛んできた名前のオブジェクトと比較
		{
			evPanel.color_change_white();//色を白にする
		}
		evPanel.repaint();//リロード
		repaint();//リロード
	}
}

/*イベントを管理してるclass
 *
 */
class  GPanel extends  JPanel implements MouseListener, MouseMotionListener{
	private int move_x = -100;//移動距離
	private int move_y = -100;
	private int start_x = -100;//スタート地点座標
	private int start_y = -100;
	static boolean flag = false;
	BasicStroke BStroke = new BasicStroke(5.0f);//筆の大きさ設定
	private int framex = 1000;//基礎の大きさ
	private int framey = 1000;
	private int iroiro = 0;//色を変更する番号
	BufferedImage seve_field = new BufferedImage(framex,framey, BufferedImage.TYPE_4BYTE_ABGR);//メモリの確保
	public GPanel()
	{
		addMouseListener(this);//イベントの具現化
		addMouseMotionListener(this);//イベントの具現化

	}
	/*グラフィック描写*/
	@Override
	public void paintComponent(Graphics g)
	{
		if(flag){

			seve_field = new BufferedImage(framex, framey, BufferedImage.TYPE_4BYTE_ABGR);//メモリ張替え
			return ;

		}else{
			Graphics2D g2= (Graphics2D)g;//仮線
			g2.setStroke(BStroke);//筆の大きさを設定
			g2.setColor(Color.BLACK);//色設定
			Graphics seve = seve_field.createGraphics();//メモリへの窓口
			Graphics2D seve2= (Graphics2D)seve;//メモリ加工
			seve2.setStroke(BStroke);//筆の大きさを設定
			seve2.setColor(Color.BLACK);//色設定
			if(iroiro ==1){
				g2.setColor(Color.RED);//色設定
				seve2.setColor(Color.RED);//色設定
			}
			if(iroiro ==2){
				g2.setColor(Color.WHITE);//色設定
				seve2.setColor(Color.WHITE);//色設定
			}
			if(start_x==-100||start_y== -100||move_x==-100||move_y==-100)
			{
				move_x  = move_y = start_x = start_y = -100;
			}
			g.drawImage(seve_field,0,0,this);//g2の中身をメモリの大きさだけゲット
			seve2.drawLine(start_x, start_y, move_x, move_y);//線を引く
			g2.drawLine(start_x, start_y, move_x, move_y);
			start_x = move_x;
			start_y = move_y;
		}
	}


	/*if判定の関数*/
	public boolean if_root(){
		move_x  = move_y = start_x = start_y = -100;
		flag = true;
		return flag;
	}
	/*色変更関数*/
	//赤色に変更
	public void color_change_red(){
		iroiro=1;
	}
	//黒色に変更
	public void color_change_break(){
		iroiro=0;
	}
	//白色に変更
	public void color_change_white(){
		iroiro=2;
	}
	public void  ovarall_x(int x){//フレームの大きさを取得
		framex = x;
	}
	public void  ovarall_y(int y){
		framey = y;
	}
	@Override
	/*押してる間*/
	public void mousePressed(MouseEvent e)
	{
		/*初期位置の保存*/
		start_x = move_x = e.getX();
		start_y = move_y = e.getY();
		flag = false;
	}
	@Override
	/*離した時*/
	public void mouseReleased(MouseEvent e)
	{

		move_x  = move_y = start_x = start_y = -100;
	}
	@Override
	/*ドラックされたとき*/
	public void mouseDragged(MouseEvent e)
	{
		move_x = e.getX();
		move_y = e.getY();
		repaint();
	}
	@Override
	/*クリックされたとき(二つで一つ）*/
	public void mouseClicked(MouseEvent e)
	{
	}
	@Override
	/*マウスが入ったとき*/
	public void mouseEntered(MouseEvent e)
	{
	}
	@Override
	/*マウスが出たとき*/
	public void mouseExited(MouseEvent e)
	{
	}
	@Override
	/*ボタンを押さずに乗せたとき*/
	public void mouseMoved(MouseEvent e)
	{
	}
}


```
まだ問題点はいろいろあるがコード保存のため投稿。
とりあえず最低限の機能はある。