2010-11-29 165 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天的試用期。

我可以建議的另一件事是創建一個窮人相當於彈出式通知系統。當您想要提醒用戶時,請創建一個沒有邊框的框架,將其放置在屏幕的右下角,使其不可聚焦並在短時間內顯示。