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

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

ただいまの
回答率

90.61%

  • Java

    13522questions

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

マウス/キーボードイベント終了まで処理を待たせたい

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 72

mugichon

score 36

Javaで画面コピーを取得し、取得したイメージを矩形で選択するようなプログラムを作成しています。
矩形選択する特にマウスイベントやキーボードで抜けるよう、キーイベントを登録していますが、
デバッグしてみると、メインスレッドが先に終了してしまい、リスナー登録しているスレッドが残ってしまっているように見えます。

何が原因でしょうか??

試行錯誤なので汚いコードかもしれませんが、よろしくお願いします。

public class GraphicsSearch{
    public static void main(String[] args) {
        Edit();
    }
    public static Integer Edit(){
        Target ed = new Target();
        ed.Target();
        System.out.println("終わり☆");
        return IconDelivaryParameters.NORMAL_END;
    }
public class Target implements MouseListener , MouseMotionListener ,KeyListener {
    private Integer x,y;
    private Integer sx,sy;
    private Integer nx,ny;
    private Integer mx,my;
    private Integer msx,msy;

    private Rectangle rc=null;
    private boolean flg=false;
    private JFrame jframe;
    private JLabel jlabel;
    private Graphics g;
    private Integer ESC_KEY=27;
    private boolean endflg=false;

    public Integer Target(){
        Common com = new Common();
        BufferedImage scimg = com.screenCapture();
        jframe=new JFrame();
        jframe.setUndecorated(true);
        jlabel = new JLabel(new ImageIcon(scimg));
        jframe.add(jlabel);
        jframe.setVisible(true);
        GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
        device.setFullScreenWindow(jframe); 
        jlabel.addMouseListener(this);
        jlabel.addMouseMotionListener(this);
        jlabel.addKeyListener(this);
        while(!endflg){
            try {
                Thread.sleep(3000);
            } catch (InterruptedException ex) {
                Logger.getLogger(Target.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return 0;
    }
    @Override
    public void mouseClicked(MouseEvent e) {}
    @Override
    public void mousePressed(MouseEvent e) {
        System.out.println("おした");
        if(flg==false){  
            flg=true;
            x=e.getX();
            y=e.getY(); 
        }else{
            flg=false;
            endflg=true;
            nx=e.getX();
            ny=e.getY();
        }
    }
    @Override
    public void mouseReleased(MouseEvent e) {}
    @Override
    public void mouseEntered(MouseEvent e) {}
    @Override
    public void mouseExited(MouseEvent e) {}
    @Override
    public void mouseDragged(MouseEvent e) {}
    @Override
    public void mouseMoved(MouseEvent e) {
        jlabel.repaint();
        nx=e.getX();
        ny=e.getY();
        if(flg){    //選択時の描画
            mx=x<e.getX() ? x : e.getX();
            my=y<e.getY() ? y : e.getY();
            msx=x>e.getX() ? x : e.getX();
            msy=y>e.getY() ? y : e.getY();
            if(g==null){    g=jframe.getGraphics();  }
            g.setColor(Color.RED);
            g.drawRect(mx, my, msx-mx, msy-my);
        }
    }
    @Override
    public void keyTyped(KeyEvent e) { }
    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println("□CODE!!"+e.getKeyCode());
        if(e.getKeyCode()==ESC_KEY){
            endflg=true;
        }
    }
    @Override
    public void keyReleased(KeyEvent e) { }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • kei344

    2018/05/22 16:17

    質問タグがJavaScriptになっているので、JAVAに変更をお願いします。

    キャンセル

  • mugichon

    2018/05/22 16:29

    ごめんなさい。。修正しました。

    キャンセル

まだ回答がついていません

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    色のついたPanelの上にLabelの配置

    public class Picross extends JFrame implements ActionListener { int[][] questiona

  • 解決済

    インスタンスの消し方

    いまシューティングゲームみたいなものを作っています。 上から降ってくる桜の花びらをプレイヤーが弾で攻撃する感じです。 下のものがプログラムの一部になります。 コード pu

  • 解決済

    別のクラスprivate変数を呼び出せない

    発生している問題・エラーメッセージ swingでアプリケーションウィンドーを作成してtextfieldに文字を入力し、ボタンをクリックしたあとに色々処理するプログラムを作成していま

  • 解決済

    プログラムからクリックイベントを発火させる

    業務にてawtを使用してJavaアプリケーションを作成しています。 都合上、swingは使用できない仕様です。 ~やりたいこと~ あるjava.awt.TextFieldのLo

  • 受付中

    エラーの意味が分かりません

    import java.util.*; import java.awt.*; import java.awt.event.*; @SuppressWarnings("uncheck

  • 解決済

    thisの意味が分かりません。

    前提・実現したいこと プログラミング初心者です。 Javaで電卓を作っています。 コードの一番下の三行のthisというのは継承しているJFrameクラスのことを指しているのでしょう

  • 受付中

    javaで宝探しゲームを作る

    前提・実現したいこと javaを使って簡単な宝探しゲームを作成しようと考えています。 キーボードから座標を入力(例えば3-a, 5-cなど)して、下記の表が宝箱の有無によって表

  • 解決済

    Java クラスの追加方法について(テトリス)

    Javaでテトリスの実装をさせているのですが機能として次にくるブロックを表示させる機能追加をしようとしていて別途でnextblockpaenlを作成したのですが(コード2)、コード

同じタグがついた質問を見る

  • Java

    13522questions

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