概要
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を隠すで