非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

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){}
}
 

 

 

スポンサーリンク

 - Java