闪烁JFrame

时间:2010-11-29 16:37:09

标签: java swing jframe

我想创建一个具有两个特定功能的JFrame:

  1. JFrame不应该从最小化状态最大化时抓住焦点。
  2. 当JFrame从最小化状态创建或最大化时,它应该在Windows栏中闪烁,直到用户将焦点赋予它。 (如在ICQ客户alt text中)。
  3. 有人知道如何实施第二项要求吗?

    很少自我解释的例子:

    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 个答案:

答案 0 :(得分:1)

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

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

f是JFrame。

答案 1 :(得分:1)

不幸的是,这不是您可以在任何Java平台下本地执行的操作。任何设法通过使用你所展示的那种“技巧”来使其工作的人都会失望地发现它不太可能适用于其他版本的Windows,甚至是另一台具有相同版本Windows的计算机。我曾经见过Java窗口闪存的唯一一次是由于Swing在最小化任务栏的所有窗口时出现了一些故障。

this article on making Java applications feel native所示,在Mac OS上也是如此。

您最好的选择是使用上面文章中描述的技术制作一个执行Windows API调用的JNI,或者获取 JNIWrapper (搜索它)的许可证您(如果您正在制作商业应用程序,或者是为愿意为此类功能付费的客户制作商品应用程序的最佳选择)。看起来你可以为此进行30天的试用。

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