5

(組み込み) Ubuntu 12.04 システムでは、ウィンドウにいくつかのグラフィックス パターンを表示し、約 1 秒ごとに更新する単純な Java プログラムがあります。これを使用して、システムで実行されているいくつかのプロセスを監視します。問題は、アクティブで最小化されていない間、ウィンドウが更新されるたびにフォーカスを盗むことです。これにより、開いているターミナル ウィンドウでの作業が不可能になります。

アプリ フォームのコマンド ラインまたは Eclipse IDE から実行する場合の動作は同じです。

NetBeans IDE で実行している場合、Windows 7 で同じ問題は発生しません。

Java アプリが Ubuntu マシンのフォーカスを盗むのを防ぐにはどうすればよいでしょうか?


更新 1:同じ問題に苦しんでいるように見えるこの質問を見つけました: How do I stop/workaround Java apps stealing focus in Linux window manager . それを読んで、問題はJFrameをコンテナとして使用することにあることがわかりました。これは私たちが使用しているものです。彼らの解決策は、JFrame コンテナーの代わりに JWindow コンテナーを使用することでした。ただし、違いを探すと、JWindow は「裸」であり、装飾がないため「本物の」ウィンドウのようには動作しません。JFrame内でJWindow を使用して、フォーカス盗用をなくす方法はありますか?


更新 2: PC 上の Ubuntu 仮想マシンでこのプログラムを実行しようとすると、同じ誤動作が発生します。これは、Windows 7 と Linux の Java ランタイムに違いがあり、問題が Embedded Linux に固有のものではないことを示唆しています。


更新 3: SSCCE は次のとおりです。

//package SSCCE;

import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

public class MonitorSSCCE extends JFrame{

    public static void main(String[] args) 
    {
        // Set the frame
        JFrame ecoreFrame = new JFrame("SSCCE");
        ecoreFrame.setSize(120, 120);
        ecoreFrame.setVisible(true);

        // Refresh frame every 200 msec
        while (true) {
            GRFX grfx = new GRFX();
            ecoreFrame.add(grfx);
            ecoreFrame.setVisible(true);
            grfx = null;

            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {

            }
        }
    }


    static int clr = 0;

    public static class GRFX extends JPanel {

        public void paintComponent(Graphics comp) {
            Graphics2D comp2D = (Graphics2D) comp;

            // Draw a changin color rectangle
            comp2D.setColor(new Color(clr, 0, 0));
            Rectangle2D.Double rect = new Rectangle2D.Double(10, 10, 100, 100);
            comp2D.fill(rect);
            clr = clr + 10;
            if (clr > 255)
                clr = 0;
        }
    }
}

更新 4: SSCCE の準備中に、JFrame オブジェクトの多数のウィンドウ更新メソッドについて読んで調べました。問題はループsetVisible()内の呼び出しでした。解決策は、それをメソッドwhileに置き換えることでした。repaint()

4

2 に答える 2

0

ループsetVisible()内のメソッド呼び出しを置き換えると、問題が解消されます。while()repaint()

    // Refresh frame every 200 msec
    while (true) {
        GRFX grfx = new GRFX();
        ecoreFrame.add(grfx);
        ecoreFrame.repaint();
        grfx = null;

        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {

        }
    }
于 2013-08-27T16:07:27.783 に答える