为了账号安全,请及时绑定邮箱和手机立即绑定

如何将窗户拉到前面?

如何将窗户拉到前面?

慕森王 2019-08-26 19:07:11
如何将窗户拉到前面?当远程控制机制激活应用程序中的某些内容时,我们需要将Java应用程序带到前台。为了得到这个,我们在类的被调用方法中实现了代表我们的应用程序的框架(a的扩展JFrame)在实现之后:setVisible(true);toFront();在Windows XP下,这在第一次调用时工作,第二次只有任务栏中的选项卡闪烁,框架不再出现在前面。Win2k也是如此。在Vista上似乎工作正常。你有什么想法?
查看完整描述

3 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

可能的解决方案是:

java.awt.EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
        myFrame.toFront();
        myFrame.repaint();
    }});


查看完整回答
反对 回复 2019-08-26
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

Windows具有防止窗口窃取焦点的功能; 相反,它会闪烁任务栏图标。在XP中它默认是打开的(我看到改变它的唯一地方是使用TweakUI,但在某处有一个注册表设置)。在Vista中,他们可能已经更改了默认值和/或将其作为用户可访问的设置暴露在开箱即用的UI中。

从Windows 2K开始,防止窗户强迫自己到前方并获得焦点是一个特征(而且我,我很感激它)。

也就是说,我有一个小的Java应用程序,用来提醒我在工作时记录我的活动,它每30分钟就会成为活动窗口(当然可以配置)。它始终在Windows XP下始终如一,并且永远不会闪烁标题栏窗口。它使用以下代码,作为计时器事件触发的结果在UI线程中调用:

if(getState()!=Frame.NORMAL) { setState(Frame.NORMAL); }toFront();repaint();

(如果最小化,第一行恢复......实际上如果最大化也会恢复它,但我从来没有这样做)。

虽然我通常将这个应用程序最小化,但通常它只是在我的文本编辑器后面。并且,就像我说的,它总是有效的。

我确实知道你的问题可能是什么 - 也许你有一个setVisible()调用的竞争条件。除非在调用窗口时实际显示窗口,否则toFront()可能无效; 我之前遇到过requestFocus()这个问题。您可能需要在窗口激活事件的UI侦听器中放置toFront()调用。

2014-09-07:在某个时间点上面的代码停止工作,也许是在Java 6或7中。经过一些调查和实验,我不得不更新代码以覆盖窗口的toFront方法做到这一点(结合修改后的代码来自什么在上面):

setVisible(true);toFront();requestFocus();repaint();...public @Override void toFront() {
    int sta = super.getExtendedState() & ~JFrame.ICONIFIED & JFrame.NORMAL;

    super.setExtendedState(sta);
    super.setAlwaysOnTop(true);
    super.toFront();
    super.requestFocus();
    super.setAlwaysOnTop(false);}

从Java 8_20开始,这段代码似乎运行正常。


查看完整回答
反对 回复 2019-08-26
  • 3 回答
  • 0 关注
  • 392 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信