在(嵌入式)Ubuntu 12.04系统上,我们有一个简单的Java程序,它在窗口上显示一些图形模式,每秒更新一次。我们用它来监视系统上运行的一些进程。问题在于,当它处于活动状态而不是最小化时,它会在窗口更新时窃取焦点。这使得无法使用开放的终端窗口进行工作。如何在更新窗口时防止Java图形程序窃取焦点?
运行应用程序窗体命令行或从Eclipse IDE运行时的行为是相同的。
在NetBeans IDE中运行时,Windows 7上不会发生同样的问题。
我们该如何防止Java应用程序窃取对Ubuntu机器的关注?
更新1:发现这个问题似乎有同样的问题挣扎: How do I stop/workaround Java apps stealing focus in Linux window managers。 读它,我了解到,问题是使用JFrame作为容器,这是我们使用的。他们的解决方案是使用JWindow容器而不是JFrame容器。然而,寻找差异,JWindow是“裸体”,并不像“真实”的窗口,因为没有装饰品。有没有办法使用JWindow 里面的一个JFrame,从而消除重点窃取?
更新2:试图在PC上的Ubuntu的虚拟机上运行此程序会产生相同的错误行为。这表明Windows 7和Linux的Java运行时间存在差异,并且该问题不是特定于嵌入式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;
}
}
}
UPDATE 4:在编制SSCCE,我有一些阅读和了解的窗口刷新方法多如牛毛的JFrame对象。发生问题的原因是while
循环内的setVisible()
调用。解决方案是用repaint()
方法替换它。
请编辑您的问题,包括最小[SSCCE(HTTP: //sscce.org/),它表现出你描述的问题。 – trashgod
作为参考,这个[示例](http://stackoverflow.com/a/12228640/230513)“显示一些图形......,每秒更新一次,”但它并不会窃取焦点。 – trashgod
@trashgod - 谢谢。我不是Java程序员,编写应用程序的人是从书中复制代码示例 - 所以他对Java GUI概念的熟悉程度也非常有限。我会看看你提供的链接,看看它是否能解决问题。 – ysap