diff --git a/src/main/java/info/istlab/Zemi01/App.java b/src/main/java/info/istlab/Zemi01/App.java index 1bc148a..c022a1c 100644 --- a/src/main/java/info/istlab/Zemi01/App.java +++ b/src/main/java/info/istlab/Zemi01/App.java @@ -1,15 +1,16 @@ package info.istlab.Zemi01; /** - * Hello world! + * 最初に実行されるクラス * */ public class App { public static void main( String[] args ) { - System.out.println( "Hello World!" ); + System.out.println( "info.istlab.Zemi01.App.main()が実行されました。" ); + RectangleFrame.main(null); } } diff --git a/src/main/java/info/istlab/Zemi01/RectangleFrame.java b/src/main/java/info/istlab/Zemi01/RectangleFrame.java index 0275eb1..d99184f 100644 --- a/src/main/java/info/istlab/Zemi01/RectangleFrame.java +++ b/src/main/java/info/istlab/Zemi01/RectangleFrame.java @@ -5,6 +5,7 @@ import java.awt.Dimension; import java.awt.Point; import java.awt.Rectangle; +import java.awt.Toolkit; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; @@ -14,7 +15,16 @@ import javax.swing.JWindow; import javax.swing.SwingUtilities; -// 中央が透明の、ドラッグで動かせるWindow群 +/** + * 中央が透明の、ドラッグで動かせるWindow群 + * おまけ機能として、右クリックメニューから、画面キャプチャができるようにしている。 + * + * 全体が透明のウィンドウを作成すると、マウスクリックが透過せずに不便なので、 + * 今回は上下左右に細い半透明ウィンドウを配置して、枠を構成している。 + * 右上でウィンドウを閉じる機能、右下で枠をリサイズする機能、ダブルクリックで画面キャプチャ + * + * @param args + */ public class RectangleFrame implements MouseListener, MouseMotionListener { public static void main(String[] args) { @@ -24,11 +34,12 @@ rf.setVisible(true); JPopupMenu menu = new JPopupMenu(); - JMenuItem cancelMI = new JMenuItem("(close menu)"); //なにもしないメニュー。メニューを閉じるためのメニュー + JMenuItem cancelMI = new JMenuItem("(close menu)"); // なにもしないメニュー。メニューを閉じるためのメニュー menu.add(cancelMI); menu.addSeparator(); JMenuItem captureMI = new JMenuItem("capture"); - captureMI.addActionListener(e -> ScreenCapture.capture(rf.getInnerRect(), System.getProperty("user.dir") )); + captureMI.addActionListener( + e -> ScreenCapture.capture(rf.getInnerRect(), System.getProperty("user.dir"))); menu.add(captureMI); JMenuItem exitMI = new JMenuItem("exit"); exitMI.addActionListener(e -> System.exit(0)); @@ -50,26 +61,32 @@ rects[i].setBackground(c); } } + /** * 内部サイズ + * * @return */ - public Dimension getInnerDim(){ - return new Dimension(width - frameWidth*2, height - frameWidth*2); + public Dimension getInnerDim() { + return new Dimension(width - frameWidth * 2, height - frameWidth * 2); } + /** * 内部矩形の左上の点 + * * @return */ - public Point getInnerPos(){ + public Point getInnerPos() { return new Point(location.x + frameWidth, location.y + frameWidth); } + /** * 内部矩形 + * * @return */ - public Rectangle getInnerRect(){ - return new Rectangle( getInnerPos(), getInnerDim() ); + public Rectangle getInnerRect() { + return new Rectangle(getInnerPos(), getInnerDim()); } TransparentRect[] rects = new TransparentRect[4]; @@ -82,6 +99,14 @@ Dimension dim; JPopupMenu popupMenu; + /** + * コンストラクタ + * + * @param x + * @param y + * @param w + * @param h + */ public RectangleFrame(int x, int y, int w, int h) { location = new Point(x, y); width = w; @@ -98,7 +123,7 @@ public void registerPopupMenu(JPopupMenu pM) { popupMenu = pM; // for (int i = 0; i < 4; i++) { - // rects[i].addKeyListener( new EscapeCloseKeyListener(popupMenu)); + // rects[i].addKeyListener( new EscapeCloseKeyListener(popupMenu)); // } } @@ -111,7 +136,7 @@ rects[2].setSize(frameWidth, height - frameWidth * 2); rects[3].setLocation(location.x, location.y + height - frameWidth); rects[3].setSize(width, frameWidth); - for (int i = 0; i < 4; i++){ + for (int i = 0; i < 4; i++) { rects[i].toFront(); } } @@ -135,7 +160,7 @@ // System.out.println(diffx+" "+diffy); if (resizeMode) { - if (dim.width + diffx > frameWidth*2 && dim.height + diffy > frameWidth*2){ + if (dim.width + diffx > frameWidth * 2 && dim.height + diffy > frameWidth * 2) { setSize(dim.width + diffx, dim.height + diffy); } } else { @@ -148,14 +173,19 @@ if (e.getComponent() == rects[3] && e.getPoint().x > rects[3].getWidth() - frameWidth) { e.getComponent().setCursor(new Cursor(Cursor.SE_RESIZE_CURSOR)); + } else if (e.getComponent() == rects[0] && + e.getPoint().x > rects[0].getWidth() - frameWidth) { + setBackground(new Color(255, 0, 0, 100)); } else { e.getComponent().setCursor(new Cursor(Cursor.MOVE_CURSOR)); + setBackground(new Color(0, 0, 0, 80)); } } @Override public void mouseClicked(MouseEvent e) { - + if (e.getClickCount() == 2) + ScreenCapture.capture(this.getInnerRect(), System.getProperty("user.dir")); } @Override @@ -174,12 +204,22 @@ resizeMode = true; dim = new Dimension(width, height); } - // e.getComponent().requestFocusInWindow(); + if (e.getComponent() == rects[0] && + e.getPoint().x > rects[0].getWidth() - frameWidth) { + Toolkit.getDefaultToolkit().beep(); + setVisible(false); + // すぐに終了するとBeep音が聞こえないので、すこし待つ + try { + Thread.sleep(100); + } catch (InterruptedException e1) { + e1.printStackTrace(); + } + System.exit(0); + } } @Override public void mouseReleased(MouseEvent e) { - // TODO Auto-generated method stub } @@ -189,8 +229,9 @@ if (e.getComponent() == rects[3] && e.getPoint().x > rects[3].getWidth() - frameWidth) { rects[3].setCursor(new Cursor(Cursor.SE_RESIZE_CURSOR)); - } else { - e.getComponent().setCursor(new Cursor(Cursor.MOVE_CURSOR)); + } else if (e.getComponent() == rects[0] && + e.getPoint().x > rects[0].getWidth() - frameWidth) { + setBackground(new Color(255, 0, 0, 100)); } } @@ -207,10 +248,10 @@ * 半透明の部品 * * 0000000000000000000000000 - * 11 22 - * 11 22 - * 11 22 - * 11 22 + * 11 22 + * 11 22 + * 11 22 + * 11 22 * 3333333333333333333333333 * */ @@ -224,14 +265,14 @@ } // class EscapeCloseKeyListener extends KeyAdapter { -// JPopupMenu target; -// public EscapeCloseKeyListener(JPopupMenu t){ -// target = t; -// } -// public void keyPressed(KeyEvent e){ -// System.out.println(e.getKeyCode()); -// if (e.getKeyCode() == KeyEvent.VK_ESCAPE){ -// target.setVisible(false); -// } -// } +// JPopupMenu target; +// public EscapeCloseKeyListener(JPopupMenu t){ +// target = t; +// } +// public void keyPressed(KeyEvent e){ +// System.out.println(e.getKeyCode()); +// if (e.getKeyCode() == KeyEvent.VK_ESCAPE){ +// target.setVisible(false); +// } +// } // } diff --git a/src/main/java/info/istlab/Zemi01/ScreenCapture.java b/src/main/java/info/istlab/Zemi01/ScreenCapture.java index a30a2e7..b11897b 100644 --- a/src/main/java/info/istlab/Zemi01/ScreenCapture.java +++ b/src/main/java/info/istlab/Zemi01/ScreenCapture.java @@ -3,6 +3,7 @@ import java.awt.Desktop; import java.awt.Rectangle; import java.awt.Robot; +import java.awt.Toolkit; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; @@ -11,6 +12,7 @@ public class ScreenCapture { public static void capture(Rectangle maybe, String dirPath) { + Toolkit.getDefaultToolkit().beep(); File dir = new File(dirPath); if (!dir.exists()) {