質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Q&A

1回答

5743閲覧

[JAVA Swing]キャプチャツールのキャプチャ範囲指定

junn

総合スコア65

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

0グッド

0クリップ

投稿2015/07/15 01:35

編集2015/07/22 08:09

以下のツールを使って画面キャプチャツールをつくっていっるのですが、キャプチャするとフルスクリーンでキャプチャされてしまいます。
指定の範囲やマウスで範囲指定した時などのキャプチャ方法が知りたいです。
マウスリスナーを使い範囲指定するのかなというところまでわかりました。

実際に追加するソースコード等を教えていただけると
助かります。

MainInit

lang

1public class MainInit implements ActionListener, MouseListener, MouseMotionListener{ //impriments(組み込む) 2 private JFrame mainFrame; 3 private Container contentPane; 4 private JPanel itemPanel; 5 private JPanel textPanel; 6 private JPanel buttonPanel; 7 private JTextField textField; 8 private JButton dirButton; 9 private JButton addButton; 10 private ScreenShot screenShot; 11 private String folderpath; 12 private JLabel folderlabel; 13 14 15 private ItemBox itemboxtest1; 16 private ItemBox itemboxtest2; 17 private ItemBox itemboxtest3; 18 private ItemBox itemboxtest4; 19 20 private Thumbnail DrawPanel; 21 22 private JFrame mainFrame2; 23 private Point startPoint; 24 private Point endPoint; 25 private int x; 26 private int y; 27 public MainInit(){ 28 mainFrame = new JFrame("エビデンスキャプチャ"); 29 mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainFrame.setSize(500, 300); mainFrame.setLocationRelativeTo(null); contentPane = mainFrame.getContentPane(); 30 31 contentPane.setLayout(null); 32 33 34 dirButton = new JButton("Dir"); dirButton.setBounds(20, 0, 80, 30); 35 contentPane.add(dirButton); addButton = new JButton("Capture"); 36 addButton.setBounds(400, 0, 90, 60); 37 contentPane.add(addButton); 38 39 40 41 42 43 JMenuBar menubar = new JMenuBar(); 44 JMenu menu1 = new JMenu("設定"); JMenu menu2 = new JMenu("ヘルプ"); 45 JMenuItem menuitem1 = new JMenuItem("設定"); 46 47 menubar.add(menu1); 48 menubar.add(menu2); 49 menu1.add(menuitem1); 50 51 mainFrame.getRootPane().setJMenuBar(menubar); 52 folderlabel = new JLabel(); 53 textField = new JTextField(); 54 //「追加」ボタンとアクション・リスナーの関連付け 55 dirButton.addActionListener(this); 56 dirButton.setActionCommand("Dir"); addButton.addActionListener(this); 57 addButton.setActionCommand("Capture") 58 59 60 61 itemPanel = new JPanel(); itemPanel.setBounds(0, 0, 500, 100); 62 contentPane.add(itemPanel); 63 textPanel = new JPanel(); textPanel.setLayout(null); 64 contentPane.add(textPanel); 65 textPanel.setBounds(0,80, 500, 100); 66 67 buttonPanel = new JPanel(); 68 69 buttonPanel.setLayout(null); 70 contentPane.add(buttonPanel); 71 buttonPanel.setBounds(0,180,500,200); 72 ; 73 74 75 itemboxtest1 = new ItemBox(); 76 itemPanel.add(itemboxtest1); 77 78 79 itemboxtest2 = new ItemBox(); 80 itemPanel.add(itemboxtest2); 81 82 itemboxtest3 = new ItemBox(); 83 itemPanel.add(itemboxtest3); 84 85 itemboxtest4 = new ItemBox(); 86 itemPanel.add(itemboxtest4); 87 88 89 textPanel.add(folderlabel); 90 folderlabel.setBounds(0, 30, 200, 30); 91 92 textPanel.add(textField); 93 textField.setBounds(320, 30, 150, 30); 94 95 buttonPanel.add(dirButton); 96 buttonPanel.add(addButton); 97 98 99 100 101 102 folderpath = "C:\\tmp"; 103 folderlabel.setText(folderpath); 104 105 textField.setText("UT_CNT_%d-%d-%d-%d"); mainFrame.setVisible(true); 106 screenShot = new ScreenShot(); 107 108 } 109 110 111 112 113 public void actionPerformed(ActionEvent event){ 114 String cmd = event.getActionCommand(); 115 116 if(cmd.equals("Capture")){ 117 beforeProcess(); 118 int x = mainFrame.getX(); 119 int y = mainFrame.getY(); 120 121 122 123 124 try{ 125 File filepath = FilePathCreate(); 126 127 mainFrame.setLocation(-1000,-1000); 128 129 screenShot.screenCapture(filepath, endPoint, endPoint); 130 131 132 mainFrame.setLocation(x, y); 133 134 new Thumbnail(filepath); 135 136 } catch (AWTException e){ 137 138 e.printStackTrace(); 139 } catch (IOException e){ 140 e.printStackTrace(); 141 } 142 143 144 } 145 146 147 else if(cmd.equals("Dir")) { 148 149 150 151 152 153 JFileChooser filechooser = new JFileChooser(folderpath); 154 filechooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 155 156 int selected = filechooser.showSaveDialog(this.contentPane); 157 if (selected == JFileChooser.APPROVE_OPTION){ 158 File file = filechooser.getSelectedFile(); 159 folderpath = file.getAbsolutePath(); 160 folderlabel.setText(folderpath); 161 162 163 } 164 } 165 166 167 } 168 169 170 public File FilePathCreate() { 171 String filename = FileNameCreate(); 172 String name = filename; 173 int m = 1; 174 do { 175 File f = new File(folderpath, name + ".jpg"); 176 if (!f.exists()) { 177 return f; 178 } 179 ++m; 180 name = filename + "(" + m + ")" ; 181 } while (m < 100); // 無限ループ防止 182 throw new IllegalStateException("パス生成失敗"); 183 184 } 185 186 187 public String FileNameCreate() { 188 String filename; 189 String[] itemNumbers = new String[4]; 190 filename = textField.getText(); 191 int i=0; 192 int found = 0; 193 194 itemNumbers[0] = itemboxtest1.getText(); 195 itemNumbers[1] = itemboxtest2.getText(); 196 itemNumbers[2] = itemboxtest3.getText(); 197 itemNumbers[3] = itemboxtest4.getText(); 198 199 for(i=0; i<4; i++){ 200 found = filename.indexOf("%d",found); 201 if( found != 0 ){ 202 filename = filename.replaceFirst("%d",itemNumbers[i]); 203 } 204 } 205 return filename; 206 } 207 208 209 public void windowDeactivated(WindowEvent we) { System.out.println("windowClosing"); 210 211 } 212 public static void main(String[] args) { 213 new MainInit(); 214 } 215 216 @Override 217 public void mouseClicked(MouseEvent e) { 218 } 219 220 221 222 223 @Override 224 public void mousePressed(MouseEvent e) { 225 startPoint = e.getPoint(); 226 227 } 228 229 230 231 232 @Override 233 public void mouseReleased(MouseEvent e) { / 234 endPoint = e.getPoint(); 235 afterProcess(); 236 237 } 238 239 240 241 242 @Override 243 public void mouseEntered(MouseEvent e) { 244 245 } 246 247 248 249 250 @Override 251 public void mouseExited(MouseEvent e) { 252 253 254 } 255 public void beforeProcess() { 256 257 x = mainFrame.getX(); 258 y = mainFrame.getY(); 259 mainFrame.setLocation(-1000,-1000); 260 261 262 JFrame.setDefaultLookAndFeelDecorated(false); 263 mainFrame2 = new JFrame(); 264 mainFrame2.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); 265 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 266 mainFrame2.setSize(screenSize.width, screenSize.height); 267 JPanel p = new JPanel(); 268 p.setBackground(new Color(.5f,.5f,.5f,.5f)); 269 mainFrame2.getContentPane().add(p); 270 271 mainFrame2.setLocationRelativeTo(null); 272 mainFrame2.setUndecorated(true); 273 274 com.sun.awt.AWTUtilities.setWindowOpaque(mainFrame2, false); //半透明化 275 mainFrame2.addMouseListener(this); 276 mainFrame2.addMouseMotionListener(this); 277 mainFrame2.setVisible(true); 278 279 } 280 281 public void afterProcess() { 282 mainFrame2.dispose(); 283 File filepath = FilePathCreate(); 284 try { 285 screenShot.screenCapture(filepath,startPoint,endPoint); 286 } catch (AWTException e1) { 287 // TODO 自動生成された catch ブロック 288 e1.printStackTrace(); 289 } catch (IOException e1) { 290 // TODO 自動生成された catch ブロック 291 e1.printStackTrace(); 292 } 293 // 自分を表示(元の位置に移動) 294 mainFrame.setLocation(x, y); 295 } 296 297 298 299 300@Override 301public void mouseDragged(MouseEvent e) { 302 303} 304 305 306 307 308@Override 309public void mouseMoved(MouseEvent e) { 310 311} 312 313} 314 315 316 317 318

ScreenShot

lang

1 2public class ScreenShot { 3 4 public void screenCapture(File filepath, Point startPoint, Point endPoint) throws AWTException, IOException { 5 Robot robot = new Robot(); 6 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 7 BufferedImage image = robot.createScreenCapture( 8 new Rectangle( (int)startPoint.getX(), 9 (int)startPoint.getY(), 10 (int )(endPoint.getX() - startPoint.getX()), 11 (int)(endPoint.getY() - startPoint.getY()))); 12 ImageIO.write(image, "PNG", filepath); //PNGファイルの保存 13 } 14} 15

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

マウスで範囲指定のキャプチャ方法です

やっている事は「Capture」ボタンを押した後に半透明なフレームを画面全体に配置し
その上でマウスのドラッグ開始・終了位置の座標とを取得し
screenCaptureに渡しているだけです

指標になれば程度なので
ドラッグ終了座標の方が大きくなったりすると恐らくエラーが出ますし、
ドラッグ範囲も表示されないので、MouseMotionListenerも追加して
ドラッグ範囲を枠で表示したりした方が機能的だったりします

MainInit

lang

1public class MainInit implements ActionListener , WindowListener { 2 3 …中略… 4 5 // 利用者の操作に応じた処理を実装 6 public void actionPerformed(ActionEvent event){ 7 // コマンド文字列を取得 8 String cmd = event.getActionCommand(); 9 10 if(cmd.equals("Capture")){ 11 …中略… 12 }

lang

1public class MainInit implements ActionListener , WindowListener,MouseListener{ 2 3 …中略… 4 5// メンバー追加 6 private JFrame mainFrame2; 7 private Point startPoint; 8 private Point endPoint; 9 private int x; 10 private int y; 11 12 // 利用者の操作に応じた処理を実装 13 public void actionPerformed(ActionEvent event){ 14 // コマンド文字列を取得 15 String cmd = event.getActionCommand(); 16 17 if(cmd.equals("Capture")){ 18 beforeProcess(); 19 }…中略… 20 } 21 22 // MouseListenerによる追加メソッド 23 @Override 24 public void mousePressed(MouseEvent e) { 25 startPoint = e.getPoint(); 26 } 27 28 @Override 29 public void mouseReleased(MouseEvent e) { 30 endPoint = e.getPoint(); 31 afterProcess(); 32 } 33 // 追加メソッド 34 public void beforeProcess() { 35 36 x = mainFrame.getX(); 37 y = mainFrame.getY(); 38 mainFrame.setLocation(-1000,-1000); 39 40 41 JFrame.setDefaultLookAndFeelDecorated(false); 42 mainFrame2 = new JFrame(); 43 mainFrame2.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); 44 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 45 mainFrame2.setSize(screenSize.width, screenSize.height); 46 JPanel p = new JPanel(); 47 p.setBackground(new Color(.5f,.5f,.5f,.5f)); 48 mainFrame2.getContentPane().add(p); 49 50 mainFrame2.setLocationRelativeTo(null); 51 mainFrame2.setUndecorated(true); 52 53 com.sun.awt.AWTUtilities.setWindowOpaque(mainFrame2, false); 54 mainFrame2.addMouseListener(this); 55 mainFrame2.addMouseMotionListener(this); 56 mainFrame2.setVisible(true); 57 58 } 59 60 public void afterProcess() { 61 mainFrame2.dispose(); 62 File filepath = FilePathCreate(); 63 try { 64 screenShot.screenCapture(filepath,startPoint,endPoint); 65 } catch (AWTException e1) { 66 // TODO 自動生成された catch ブロック 67 e1.printStackTrace(); 68 } catch (IOException e1) { 69 // TODO 自動生成された catch ブロック 70 e1.printStackTrace(); 71 } 72 // 自分を表示(元の位置に移動) 73 mainFrame.setLocation(x, y); 74 }

ScreenShot

lang

1 public void screenCapture(File filepath) throws AWTException, IOException { 2 Robot robot = new Robot(); 3 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 4 BufferedImage image = robot.createScreenCapture( 5 new Rectangle(0, 0, screenSize.width, screenSize.height)); 6 ImageIO.write(image, "PNG", filepath); //PNGファイルの保存 7 }

lang

1 public void screenCapture(File filepath, Point startPoint, Point endPoint) throws AWTException, IOException { 2 Robot robot = new Robot(); 3 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 4 BufferedImage image = robot.createScreenCapture( 5 new Rectangle( (int)startPoint.getX(), 6 (int)startPoint.getY(), 7 (int )(endPoint.getX() - startPoint.getX()), 8 (int)(endPoint.getY() - startPoint.getY()))); 9 ImageIO.write(image, "PNG", filepath); //PNGファイルの保存 10 }

投稿2015/07/15 05:57

shaha

総合スコア166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

junn

2015/07/16 00:58 編集

shahaさん 解答ありがとうございます。返事が遅くなってしまいもうしわけありません。 MainInitの追加メソッドは public void mouseExited(MouseEvent e) { // TODO 自動生成されたメソッド・スタブ } の後に追加すればよいでしょうか?
shaha

2015/07/16 06:24

はい、mouseExitedの後で問題ありません
junn

2015/07/16 07:34

解答ありがとうございます。 実行しましたところ、com.sun.awt.AWTUtilities.setWindowOpaque(mainFrame2, false); で「使用可能な候補はありません」とでてしまいました。。。
shaha

2015/07/16 09:05

junnさんの環境がEclipseか、どうかは判りませんが 私が設定した手順は 「ビルドパス」→「ビルドパスの構成」→「ライブラリー」→「アクセスルール」を選択 「編集」→「追加」で レゾリューションを「アクセス可能」 ルールパターンを「com/sun/awt/*」 で「OK」をクリック 以上です これで行けると思います
junn

2015/07/17 01:51 編集

お疲れ様です。 ルールパターンに「com/sun/awt/*」で追加したところ エラーが消えました! ただ mainFrame2.addMouseMotionListener(this);で 「型 Component のメソッド addMouseMotionListener(MouseMotionListener) は引数 (MainInit) に適用できません」 のエラーが出て消えません... 引数を変えてあげなければだめなんですかね?
shaha

2015/07/17 01:48

screenCaptureメソッドは、私の最初の投稿に有る様に 引数を増やす必要があります (ドラッグの開始位置と終了位置を渡してあります)
junn

2015/07/17 02:07

渡してみました。’MaininitをMouseListener’に実装させるにして public class MainInit implements ActionListener , WindowListener,MouseListener{ 部分を public class MainInit implements ActionListener, WindowListener, MouseListener, MouseMotionListener にしました。グレーの半透明のものはできたのですが、マウスで変化させることが できませんでした。。。
junn

2015/07/17 02:09

screenShot.screenCapture(filepath);をscreenShot.screenCapture(filepath, startPoint, endPoint);にしてあげればよいでしょうか?
shaha

2015/07/17 02:59

最初の投稿どおり、引数は screenShot.screenCapture(filepath);をscreenShot.screenCapture(filepath, startPoint, endPoint); であってます さらに、screenShot.screenCaptureメソッドの BufferedImage image = robot.createScreenCapture( new Rectangle(0, 0, screenSize.width, screenSize.height)); 部分を BufferedImage image = robot.createScreenCapture( new Rectangle( (int)startPoint.getX(), (int)startPoint.getY(), (int )(endPoint.getX() - startPoint.getX()), (int)(endPoint.getY() - startPoint.getY()))); に、するとキャプチャされる範囲が変わります
junn

2015/07/17 04:14

お返事ありがとうございます。 そのとおりにしたのですが、全画面にグレーのフレームができて、変更不可でした。 エラー時に public void actionPerformed(ActionEvent event){ // コマンド文字列を取得 String cmd = event.getActionCommand(); if(cmd.equals("Capture")){ int x = mainFrame.getX(); int y = mainFrame.getY(); // 画面キャプチャー try{ File filepath = FilePathCreate(); // 自分を消す(見えない位置に移動) mainFrame.setLocation(-1000,-1000); // 画面キャプチャ screenShot.screenCapture(filepath); 内のscreenShot.screenCapture(filepath);を変えたのがいけなかったでしょうか?
shaha

2015/07/17 04:39

直近のコメントを見る限り、 私のソース通りでは無い様なので、 それだと答えようが無いのですが・・・ グレーのフレームを出したのは、 マウスで範囲選択をする為で、 マウスの範囲をする表示の変化は導入してません (あくまで指定した範囲をキャプチャするという機能のみを記述したので) int x = mainFrame.getX(); int y = mainFrame.getY(); と、ありますが このx,yをクラス変数にしたのは マウス範囲指定が入る為、直後に処理できないので ローカルではなくクラス変数にしています
junn

2015/07/21 00:38

返事が遅くなりすみません。 mainFrame2.addMouseMotionListener(this);で 「型 Component のメソッド addMouseMotionListener(MouseMotionListener) は引数 (MainInit) に適用できません」 エラー時に’MaininitをMouseListener’を実装したのが間違いだったのでしょうか? screenShot.screenCapture(filepath);をscreenShot.screenCapture(filepath, startPoint, endPoint);にして screenShot.screenCaptureメソッドを変えてもきえませんでした。 理解が及ばなくて申し訳ございません。 宜しくお願い致します。
shaha

2015/07/21 01:17

addMouseMotionListener部分の為に、 MouseMotionListenerを実装するのは問題無いです が、単純に後々の実装を考えてだったので私の消し忘れなので mainFrame2.addMouseMotionListener(this); 自体は無くても動きます 現在動作的には、どの様になっている状況でしょうか?
junn

2015/07/21 01:54 編集

そうなのですね。 現在はキャプチャボタンを押すとフルスクリーンでグレーのフレームが出て、エラーに なっています。もう一度グレーのフレームを押下すると元に戻ります。
junn

2015/07/21 02:37

一度直したソースコードを載せたほうが良いでしょうか?
shaha

2015/07/21 02:43

動いているソースを回答で投稿しようをしたのですが (コメントだとソースが、分かりにくい為) 1人1回しか回答できないみたいですね… 一応、こちらの動きとしては 起動後 「Capture」をクリックするとグレーになって その状態でマウスで範囲指定(今のところ左上から右下の順で指定いないとエラーになる) でキャプチャが保存される という感じになってます (ちなみに立ち上げ直後は存在しないディレクトリが指定されているので そのままキャプチャすると、こちらもエラーになってます) こんな感じです ソースを見た方が早いかも知れないですね
junn

2015/07/22 07:36

そうなのですね。わかりました。編集してソースコードを掲載してみます。
junn

2015/07/22 08:10

編集したソースコード載せました。文字数制限のためItemBoxを省略しました。 必要であればまた言ってください。宜しくお願いします
shaha

2015/07/22 08:41

変更されたソースで動かしてみました エラーログは出力されますが 一応マウスで指定した範囲のキャプチャは 保存されてますね エラーログが出力されるのは 「Capture」ボタンが押された時に screenCaptureを呼んでいるからです マウスで範囲指定が終わってから呼んでいるので必要ないです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問