• category: swing folder: StatusBar title: JFrameのリサイズが可能なサイズグリップ付きのステータスバーを作成する tags: [JPanel, JLabel, JFrame] author: aterai pubdate: 2020-06-29T05:08:14+09:00 description: JFrameの下部にマウスドラッグでリサイズが可能なサイズグリップ付きのステータスバーを配置します。 image: https://drive.google.com/uc?id=1axOgWRI88iTM2MsOfCiFhDfcAMnMYCNf

概要

JFrameの下部にマウスドラッグでリサイズが可能なサイズグリップ付きのステータスバーを配置します。

サンプルコード

class ResizeWindowListener extends MouseInputAdapter {
  private final Rectangle rect = new Rectangle();
  private final Point startPt = new Point();

  @Override public void mousePressed(MouseEvent e) {
    Component p = SwingUtilities.getRoot(e.getComponent());
    if (p instanceof Window) {
      startPt.setLocation(e.getPoint());
      rect.setBounds(p.getBounds());
    }
  }

  @Override public void mouseDragged(MouseEvent e) {
    Component p = SwingUtilities.getRoot(e.getComponent());
    if (!rect.isEmpty() && p instanceof Window) {
      Point pt = e.getPoint();
      rect.width += pt.x - startPt.x;
      rect.height += pt.y - startPt.y;
      p.setBounds(rect);
    }
  }
}
View in GitHub: Java, Kotlin

解説

  • ステータスバー
    • BorderLayoutを設定したJPanelで作成
  • サイズグリップ
    • グリップIconを設定したJLabelで作成し、ステータスバーの右端(BorderLayout.EAST)に配置
    • マウスカーソルでのリサイズはJFrameのタイトルバーなどの装飾を独自のものにカスタマイズするの右下コーナー用の処理を適用
      class BottomRightCornerLabel extends JLabel {
        private transient MouseInputListener handler;
      
        protected BottomRightCornerLabel() {
          super(new BottomRightCornerIcon());
        }
      
        @Override public void updateUI() {
          removeMouseListener(handler);
          removeMouseMotionListener(handler);
          super.updateUI();
          handler = new ResizeWindowListener();
          addMouseListener(handler);
          addMouseMotionListener(handler);
          setCursor(Cursor.getPredefinedCursor(Cursor.SE_RESIZE_CURSOR));
        }
      }
      
  • グリップアイコン
    • Windows 10風?の6個の四角形を以下のように配置して作成
      class BottomRightCornerIcon implements Icon {
        private static final Color SQUARE_COLOR = new Color(160, 160, 160, 160);
      
        @Override public void paintIcon(Component c, Graphics g, int x, int y) {
          int diff = 3;
          Graphics2D g2 = (Graphics2D) g.create();
          g2.translate(getIconWidth() - diff * 3 - 1, getIconHeight() - diff * 3 - 1);
      
          int firstRow = 0;
          int secondRow = firstRow + diff;
          int thirdRow = secondRow + diff;
      
          int firstColumn = 0;
          drawSquare(g2, firstColumn, thirdRow);
      
          int secondColumn = firstColumn + diff;
          drawSquare(g2, secondColumn, secondRow);
          drawSquare(g2, secondColumn, thirdRow);
      
          int thirdColumn = secondColumn + diff;
          drawSquare(g2, thirdColumn, firstRow);
          drawSquare(g2, thirdColumn, secondRow);
          drawSquare(g2, thirdColumn, thirdRow);
      
          g2.dispose();
        }
      
        @Override public int getIconWidth() {
          return 16;
        }
      
        @Override public int getIconHeight() {
          return 20;
        }
      
        private void drawSquare(Graphics g, int x, int y) {
          g.setColor(SQUARE_COLOR);
          g.fillRect(x, y, 2, 2);
        }
      }
      

参考リンク

コメント