Swing/DraggableTitleBarComponents のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/DraggableTitleBarComponents へ行く。
- 1 (2020-10-26 (月) 00:40:22)
- 2 (2022-07-22 (金) 11:46:19)
- category: swing folder: DraggableTitleBarComponents title: JFrameのタイトルバーに追加したコンポーネントをドラッグ可能にする tags: [JFrame, JLayer] author: aterai pubdate: 2020-10-26T00:39:08+09:00 description: JFrameに独自のタイトルバーを設定しその内部に追加したコンポーネントをマウスでドラッグ可能に設定します。 image: https://drive.google.com/uc?id=1fq7ACTABN4Xp10gFQMkWt-8H0jrsSDfG
概要
JFrame
に独自のタイトルバーを設定しその内部に追加したコンポーネントをマウスでドラッグ可能に設定します。
Screenshot
Advertisement
サンプルコード
class TitleBarDragLayerUI extends LayerUI<JComponent> {
private final Point startPt = new Point();
@Override public void installUI(JComponent c) {
super.installUI(c);
if (c instanceof JLayer) {
((JLayer<?>) c).setLayerEventMask(
AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK);
}
}
@Override public void uninstallUI(JComponent c) {
if (c instanceof JLayer) {
((JLayer<?>) c).setLayerEventMask(0);
}
super.uninstallUI(c);
}
@Override protected void processMouseEvent(
MouseEvent e, JLayer<? extends JComponent> l) {
if (e.getID() == MouseEvent.MOUSE_PRESSED
&& SwingUtilities.isLeftMouseButton(e)) {
startPt.setLocation(e.getPoint());
}
}
@Override protected void processMouseMotionEvent(
MouseEvent e, JLayer<? extends JComponent> l) {
Component c = SwingUtilities.getRoot(e.getComponent());
if (e.getID() == MouseEvent.MOUSE_DRAGGED
&& c instanceof Window && SwingUtilities.isLeftMouseButton(e)) {
Point pt = c.getLocation();
c.setLocation(pt.x - startPt.x + e.getX(), pt.y - startPt.y + e.getY());
}
}
}
View in GitHub: Java, Kotlin解説
TitleBar
- システムのタイトルバーを
setUndecorated(true)
で非表示に設定し代わりにJPanel
を追加 - タイトルバーとして設定した
JPanel
にJLayer
を追加し、内部の子コンポーネントへのドラッグイベントを親JFrame
の移動に変換
- システムのタイトルバーを
JComboBox
- JComboBoxのArrowButtonを隠すで
ArrowButton
は非表示 MouseListener
を追加してmousePressed
ではなく、mouseClicked
時にドロップダウンリストを表示するよう設定
- JComboBoxのArrowButtonを隠すで