Java/Swingで付箋紙みたいなやつを作ったのでソースコードを書き留めておく
Java/Swingで付箋紙みたいなものが作れないか試してみました。結果、以下の動画のようなものができました。まだ付箋紙としての機能は不十分ですがタイトルバーなしでドラッグ移動という部分はJava/Swingでに可能であることはわかりました。
タイトルバーなしにする方法
FrameクラスのsetUndecorated()メソッドでタイトルバーを無効化無効化できます。但し、フレームが表示されていない時にだけ呼び出すことができるものなので、表示後にタイトルバー有無の切り替えは難しいですね。
StickyNote f = new StickyNote(); f.setUndecorated(true);
ドラッグ移動にする方法
ウィンドウの移動はタイトルバーをフォラッグすることでできますが、付箋紙はそのタイトルバーがないので移動できなくなります。また、一般的な付箋紙はどこをドラッグしても移動することができるわけで、そのように実装する必要あります。
MouseMotionListener, MouseListenerを実装した上で、mousePressedメソッドとmouseDraggedメソッドで以下のようにすれば可能になります。
//MouseMotionListener, MouseListenerを実装する。
//以下をインスタンス変数にしてクラス内で使えるようにしておく
//private Point loc;
//private MouseEvent start;
//最初に掴んだポイントを記憶
public void mousePressed(MouseEvent e) { start=e; }
//ドラッグ中の位置の移動
public void mouseDragged(MouseEvent e){
Window window = this;
loc = window.getLocation(loc);
int x = loc.x - start.getX() + e.getX();
int y = loc.y - start.getY() + e.getY();
window.setLocation(x, y);
}
ソースコード全文
以上を踏まえてソースコード全文です。これを実行すれば冒頭で紹介した付箋紙的なものが現れます。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class StickyNote extends JFrame implements MouseMotionListener, MouseListener{
private Container pane;
private JLabel label;
private Point loc;
private MouseEvent start;
public static void main(String[] args){
StickyNote f = new StickyNote(" StickyNote", 300, 200);
f.setUndecorated(true);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
//コンストラクタ
StickyNote(String t, int w, int h){
super(t);
setSize(w, h);
pane = getContentPane();
pane.setLayout(new BorderLayout());
label = new JLabel("付箋紙みたいなやつ");
pane.add(label, BorderLayout.CENTER);
label.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
label.setVerticalAlignment(JLabel.TOP);
label.setFont(new Font("Meiryo UI", Font.PLAIN, 24));
label.addMouseListener(this);
label.addMouseMotionListener(this);
label.setOpaque(true);
label.setBackground(Color.cyan);
}
public void mouseMoved(MouseEvent e){}
public void mouseDragged(MouseEvent e){
Window window = this;
loc = window.getLocation(loc);
int x = loc.x - start.getX() + e.getX();
int y = loc.y - start.getY() + e.getY();
window.setLocation(x, y);
}
public void mouseClicked(MouseEvent e){
if(e.getClickCount()>=2){
System.exit(0);
}
}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mousePressed(MouseEvent e) { start=e; }
public void mouseReleased(MouseEvent e){}
}
スポンサーリンク