2010-11-29 168 views
4

我想创建一个JFrame有两个specifal特点:同时从最小化状态最大化闪烁的JFrame

  1. 的JFrame应该不会抢焦点。
  2. 当JFrame创建或从最小化状态变为最大化时,它应该在Windows栏中闪烁,直到用户将焦点赋予它为止。 (如在ICQ客户端alt text中那样)。

有谁知道第二个要求是如何实现的吗?

一点自我解释的例子:

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

public class JFrameTest { 
    private static JFrame childFrame; 
    public static Container getParentContentPane() { 
     JPanel panel = new JPanel(); 
     JButton button = new JButton("Create\\Restore child frame"); 
     button.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e) { 
       createOrRestoreChildFrame(); 
      } 
     }); 
     panel.add(button); 
     return panel; 
    } 

    private static void createOrRestoreChildFrame() { 
     if (childFrame == null) { 
      childFrame = new JFrame("Child Frame"); 
      childFrame.setLocation(200, 200); 
      childFrame.add(new JLabel("Child Frame")); 
      childFrame.pack(); 
      setChildFrameVisible(); 
     } else { 
      setChildFrameVisible(); 
     } 
    } 

    private static void setChildFrameVisible() { 
     childFrame.setFocusableWindowState(false); 
     childFrame.setVisible(true); 
     flashInWindowsBar(childFrame); 
     childFrame.toFront(); 
     childFrame.setFocusableWindowState(true); 
    } 

    /** 
    * Should Make child frame flash in Windows bar. 
    * Currently, it does not work for me. 
    * Could anybody help me to fix this please?) 
    */ 
    private static void flashInWindowsBar(JFrame childFrame) { 
     childFrame.setState(JFrame.ICONIFIED); 
     childFrame.toFront(); 
    } 

    private static void createAndShowGUI() { 
     JFrame parentFrame = new JFrame("JFrame Demo"); 
     parentFrame.setLocation(100, 100); 
     parentFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     parentFrame.setContentPane(getParentContentPane()); 
     parentFrame.pack(); 
     parentFrame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 

谢谢!

+2

尝试http://stackoverflow.com/questions/489255/using-swing-how-can-i-flash-the-windows-taskbar – 2010-11-30 10:15:37

回答

1

下面的代码为我工作完全按照您描述:

f.setState(JFrame.ICONIFIED); 
    f.toFront(); 

f是一个JFrame。

+0

谢谢亚历克斯,不幸的是,它不适合我。 – Ted 2010-11-30 09:14:41

1

不幸的是,这不是你可以在任何Java平台下本地完成的事情。任何设法使用你所展示的'欺骗'来工作的人都会失望地发现,它不太可能在另一个版本的Windows或者甚至是具有相同版本的Windows的另一台计算机上工作。我见过Java窗口闪存的唯一时间是由于Swing中最小化所有窗口到任务栏时的一些小故障。

由于this article on making Java applications feel native显示,它在Mac OS上是一样的。

最好的办法是使用上述文章中描述的技术,使一个JNI它执行的Windows API调用,或获得许可的JNIWrapper(搜索),其中所有这一切为你(最好的选择如果您正在制作商业应用程序,或者为愿意为此功能付费的客户提供服务)。看起来您可以为此获得30天的试用期。

我可以建议的另一件事是创建一个穷人相当于弹出式通知系统。当您想要提醒用户时,请创建一个没有边框的框架,将其放置在屏幕的右下角,使其不可聚焦并在短时间内显示。