Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何防止任务栏中的JFrame警报效果_Java_Swing_Jframe_Taskbar_Jinternalframe - Fatal编程技术网

Java 如何防止任务栏中的JFrame警报效果

Java 如何防止任务栏中的JFrame警报效果,java,swing,jframe,taskbar,jinternalframe,Java,Swing,Jframe,Taskbar,Jinternalframe,我是一名Java SE开发人员,我们的程序只在windows操作系统上运行,程序需要打开文件并在UI中显示,我们在JInternalFrame中显示文件内容,并且在打开文件时总是setselected(true) 最近,我们将我们的程序从JRE1.6.0_41更新为JRE1.8.0_144,以查找一个主要错误,并注意到在JRE1.8.0_144中,当我们的程序(JFrame)没有聚焦并在JFrame中的JInternalFrame上调用setselected(true)时,JFrame会在任务栏

我是一名Java SE开发人员,我们的程序只在windows操作系统上运行,程序需要打开文件并在UI中显示,我们在JInternalFrame中显示文件内容,并且在打开文件时总是
setselected(true)

最近,我们将我们的程序从
JRE1.6.0_41
更新为
JRE1.8.0_144
,以查找一个主要错误,并注意到在JRE1.8.0_144中,当我们的程序(JFrame)没有聚焦并在JFrame中的JInternalFrame上调用
setselected(true)
时,JFrame会在任务栏中闪烁,而JRE1.6.0_41则不会。一些客户认为这很烦人,因为他们必须经常打开文件

所以问题是:

(1) 我可以关掉这个功能吗

(2) 如果不能,在JInternalFrame上仍然可以
setSelected()
时,是否有其他方法避免闪烁效果

如果我没有解释清楚,下面是演示警报效果的示例代码,请运行程序并将其最小化到任务栏切换到另一个窗口,然后它应该闪烁。我已经在Windows7、Windows8.1和Windows10上进行了测试,它们都具有相同的警报效果

import javax.swing.JInternalFrame;
import javax.swing.SwingUtilities;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;

import java.awt.*;

/*
 * Copy and modified by Oracle sample code "InternalFrameDemo.java"
 */
public class Login extends JFrame {
    JDesktopPane desktop;
    private int m_iFrameCounter = 0;

    public Login() {
        super("InternalFrameDemo");

        //Make the big window be indented 50 pixels from each edge
        //of the screen.
        int inset = 50;
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        setBounds(inset, inset,
                  screenSize.width  - inset*2,
                  screenSize.height - inset*2);

        //Set up the GUI.
        desktop = new JDesktopPane(); //a specialized layered pane
        createFrame(); //create first "window"
        setContentPane(desktop);

        //Make dragging a little faster but perhaps uglier.
        desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);

        // Add new frame every second
        Thread addFrameThread = new Thread() {

            @Override
            public void run() {
                while(true) {
                    SwingUtilities.invokeLater(new Runnable() {

                        @Override
                        public void run() {
                            createFrame();
                        }
                    });
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        addFrameThread.start();
    }

    //Create a new internal frame.
    protected void createFrame() {
        JInternalFrame frame = new JInternalFrame();
        frame.setTitle("" + m_iFrameCounter);
        frame.setSize(100, 100);
        frame.setLocation(0, 0);
        frame.setVisible(true); //necessary as of 1.3
        desktop.add(frame);
        frame.moveToFront();
        try {
            frame.setSelected(true);
        } catch (java.beans.PropertyVetoException e) {}
        m_iFrameCounter++;
    }

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {
        //Make sure we have nice window decorations.
        JFrame.setDefaultLookAndFeelDecorated(true);

        //Create and set up the window.
        Login frame = new Login();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Display the window.
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
更新01

这是更新代码,它接受@camickr建议添加
KeyboardFocusManager
WindowListener
,仅当JFrame具有焦点或JFrame获得焦点时,JInternalFrame上的
setselected(true)
,但如果频繁切换窗口,警报仍会发生,我认为这是因为JFrame在JInternalFrame上的
setselected(true)
之前失去了焦点。也许有办法改进代码

import javax.swing.JInternalFrame;
import javax.swing.SwingUtilities;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;

import java.awt.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.beans.PropertyVetoException;

/*
 * Copy and modified by Oracle sample code "InternalFrameDemo.java"
 */
public class Login extends JFrame {
    JDesktopPane desktop;
    private int m_iFrameCounter = 0;
    private JInternalFrame m_InternalFrameWaitSelected = null;

    public Login() {
        super("InternalFrameDemo");

        //Make the big window be indented 50 pixels from each edge
        //of the screen.
        int inset = 50;
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        setBounds(inset, inset,
                  screenSize.width  - inset*2,
                  screenSize.height - inset*2);

        //Set up the GUI.
        desktop = new JDesktopPane(); //a specialized layered pane
        createFrame(); //create first "window"
        setContentPane(desktop);

        //Make dragging a little faster but perhaps uglier.
        desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);

        /*********************************************  update codes *********************************************/ 
        //Add window listener to set last JInternalframe selected when JFrame activated
        this.addWindowListener(new WindowListener() {

            @Override
            public void windowOpened(WindowEvent e) {
            }

            @Override
            public void windowClosing(WindowEvent e) {
            }

            @Override
            public void windowClosed(WindowEvent e) {
            }

            @Override
            public void windowIconified(WindowEvent e) {
            }

            @Override
            public void windowDeiconified(WindowEvent e) {
            }

            @Override
            public void windowActivated(WindowEvent e) {
                if (m_InternalFrameWaitSelected != null) {
                    try {
                        m_InternalFrameWaitSelected.setSelected(true);
                    } catch (PropertyVetoException e1) {
                        e1.printStackTrace();
                    }
                    m_InternalFrameWaitSelected = null;
                }
            }

            @Override
            public void windowDeactivated(WindowEvent e) {
            }

        });
        /*********************************************  update codes *********************************************/

        // Add new frame every 50 millisecond
        Thread addFrameThread = new Thread() {

            @Override
            public void run() {
                while(true) {
                    SwingUtilities.invokeLater(new Runnable() {

                        @Override
                        public void run() {
                            createFrame();
                        }
                    });
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        addFrameThread.start();
    }

    //Create a new internal frame.
    protected void createFrame() {
        JInternalFrame frame = new JInternalFrame();
        frame.setTitle("" + m_iFrameCounter);
        frame.setSize(100, 100);
        frame.setLocation(0, 0);
        frame.setVisible(true); //necessary as of 1.3
        desktop.add(frame);
        frame.moveToFront();
        /*********************************************  update codes *********************************************/
        // Only setselect(true) when JFrame is focus owner
        if (KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() != null &&
                SwingUtilities.isDescendingFrom(KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(), this)) {
            try {
                frame.setSelected(true);
            } catch (java.beans.PropertyVetoException e) {}
        } else {
            m_InternalFrameWaitSelected = frame;
        }
        /*********************************************  update codes *********************************************/
        m_iFrameCounter++;
    }

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {
        //Make sure we have nice window decorations.
        JFrame.setDefaultLookAndFeelDecorated(true);

        //Create and set up the window.
        Login frame = new Login();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Display the window.
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
更新02

尝试使用
GetGlobalActiveWindows()
windowActivated/windowDeactivated
,如果频繁切换窗口,仍会出现警报。以下是测试代码:

getGlobalActivieWindow()

窗口激活/窗口停用

import javax.swing.JInternalFrame;
import javax.swing.SwingUtilities;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;

import java.awt.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.beans.PropertyVetoException;

/*
 * Copy and modified by Oracle sample code "InternalFrameDemo.java"
 */
public class Login extends JFrame {
    JDesktopPane desktop;
    private int m_iFrameCounter = 0;
    private JInternalFrame m_InternalFrameWaitSelected = null;
    /*********************************************  update codes *********************************************/ 
    private boolean m_bIsFrameActive = false;
    /*********************************************  update codes *********************************************/ 

    public Login() {
        super("InternalFrameDemo");

        //Make the big window be indented 50 pixels from each edge
        //of the screen.
        int inset = 50;
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        setBounds(inset, inset,
                  screenSize.width  - inset*2,
                  screenSize.height - inset*2);

        //Set up the GUI.
        desktop = new JDesktopPane(); //a specialized layered pane
        setContentPane(desktop);

        //Make dragging a little faster but perhaps uglier.
        desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);

        /*********************************************  update codes *********************************************/ 
        //Add window listener to set last JInternalframe selected when JFrame activated
        this.addWindowListener(new WindowListener() {

            @Override
            public void windowOpened(WindowEvent e) {
            }

            @Override
            public void windowClosing(WindowEvent e) {
            }

            @Override
            public void windowClosed(WindowEvent e) {
            }

            @Override
            public void windowIconified(WindowEvent e) {
            }

            @Override
            public void windowDeiconified(WindowEvent e) {
            }

            @Override
            public void windowActivated(WindowEvent e) {
                m_bIsFrameActive = true;
                if (m_InternalFrameWaitSelected != null) {
                    try {
                        m_InternalFrameWaitSelected.setSelected(true);
                    } catch (PropertyVetoException e1) {
                        e1.printStackTrace();
                    }
                    m_InternalFrameWaitSelected = null;
                }
            }

            @Override
            public void windowDeactivated(WindowEvent e) {
                m_bIsFrameActive = false;
            }

        });
        /*********************************************  update codes *********************************************/

        // Add new frame every 50 millisecond
        Thread addFrameThread = new Thread() {

            @Override
            public void run() {
                while(true) {
                    SwingUtilities.invokeLater(new Runnable() {

                        @Override
                        public void run() {
                            createFrame();
                        }
                    });
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        addFrameThread.start();
    }

    //Create a new internal frame.
    protected void createFrame() {
        JInternalFrame frame = new JInternalFrame();
        frame.setTitle("" + m_iFrameCounter);
        frame.setSize(100, 100);
        frame.setLocation(0, 0);
        frame.setVisible(true); //necessary as of 1.3
        desktop.add(frame);
        frame.moveToFront();
        /*********************************************  update codes *********************************************/
        // Only setselect(true) when JFrame is active
        if (m_bIsFrameActive) {
            try {
                frame.setSelected(true);
            } catch (java.beans.PropertyVetoException e) {}
        } else {
            m_InternalFrameWaitSelected = frame;
        }
        /*********************************************  update codes *********************************************/
        m_iFrameCounter++;
    }

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {
        //Make sure we have nice window decorations.
        JFrame.setDefaultLookAndFeelDecorated(true);

        //Create and set up the window.
        Login frame = new Login();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Display the window.
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
我们在JInternalFrame中显示文件内容,并在打开文件时始终设置Selected(true)

不知道如何停止任务栏上的闪烁,但您可以通过不自动调用setSelected()来更改行为

例如,您可以:

  • 仅当框架是活动窗口时调用
    setSelected()
    。您可以使用
    KeyboardFocusManager
    检查窗口是否聚焦

  • 在帧中添加一个
    WindowListener
    ,并处理
    windowActivated
    事件,在最近打开的内部帧上调用setSelected()方法

  • 编辑:

    运行程序并将其最小化到任务栏中

    首先,我想澄清一下,如果我最小化任务栏的框架,图标闪烁就没有问题

    只有当我单击另一个应用程序时,图标才会闪烁,并且登录框在打开时失去焦点

    如果您频繁切换窗口,警报仍会发生

    我将您的代码更改为:

    //if (KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() != null &&
    //    SwingUtilities.isDescendingFrom(KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(), this)) {
    if (KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow() == this)
    {
        try
        {
            System.out.println("active");
            frame.setSelected(true);
        }
        catch (java.beans.PropertyVetoException e) {}
    }
    else
    {
        System.out.println("not");
    //  frame = m_InternalFrameWaitSelected;
        m_InternalFrameWaitSelected = frame;
    }
    
    我注意到,有时,即使is正在另一个窗口中玩游戏,也会在上显示“活动”。因此,出于某种原因,KeyboardFocusManager返回了一个不正确的值(或者我不明白该方法应该如何工作?)

    因此,您可以尝试使用
    getGlobalActiveWindow()
    方法来查看它是否有任何不同

    如果没有,那么我的下一个建议是忘记KeyboardFocusManager,管理一个布尔变量,指示帧是否处于活动状态。因此,您可以在windowActivated中设置变量true,在windowDeactivated中设置变量false。然后在创建帧时测试此变量

    还要注意我是如何更改以下代码的:

    //  frame = m_InternalFrameWaitSelected;
        m_InternalFrameWaitSelected = frame;
    

    如果有人对答案感兴趣,在我追踪JInternalFrame中的源代码之后,我发现闪烁效应是由调用
    setSelected(true)
    时的
    requestFocus()
    引起的,因此我决定继承JInternalFrame并用
    requestFocusInWindow()替换
    requestFocusInWindow()
    ,现在眨眼效果消失了

    这是我对这个问题的最终解决方案:

    import javax.swing.JInternalFrame;
    import javax.swing.SwingUtilities;
    
    import sun.swing.SwingUtilities2;
    
    import javax.swing.InternalFrameFocusTraversalPolicy;
    import javax.swing.JDesktopPane;
    import javax.swing.JFrame;
    
    import java.awt.*;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;
    import java.beans.PropertyVetoException;
    
    /*
     * Copy and modified by Oracle sample code "InternalFrameDemo.java"
     */
    public class Login extends JFrame {
        JDesktopPane desktop;
        private int m_iFrameCounter = 0;
    
        /**
         * This class is created to handle problem that program would blink in taskbar 
         * when call setSelected(true) on JInternalFrame base on JRE1.8.0_144, the only different content is
         * use lastFocusOwner.requestFocusInWindow(); instead of lastFocusOwner.requestFocus(); 
         * in method restoreSubcomponentFocus() 
         *
         */
        public class MyInternalFrame extends JInternalFrame {
    
            private Component lastFocusOwner;
            private final String BASE_JRE_VERSION = "1.8.0_144";
    
            public MyInternalFrame() {
                _checkJavaVersion();
            }
    
            public MyInternalFrame(String title) {
                super(title);
                _checkJavaVersion();
            }
    
            public MyInternalFrame(String title, boolean resizable) {
                super(title, resizable);
                _checkJavaVersion();
            }
    
            public MyInternalFrame(String title, boolean resizable, boolean closable) {
                super(title, resizable, closable);
                _checkJavaVersion();
            }
    
            public MyInternalFrame(String title, boolean resizable, boolean closable, boolean maximizable) {
                super(title, resizable, closable, maximizable);
                _checkJavaVersion();
            }
    
            public MyInternalFrame(String title, boolean resizable, boolean closable, boolean maximizable, boolean iconifiable) {
                super(title, resizable, closable, maximizable, iconifiable);
                _checkJavaVersion();
            }
    
            private void _checkJavaVersion() {
                if (!BASE_JRE_VERSION.equals(System.getProperty("java.version")))
                    System.err.println(String.format("%s is not compatible with current Java runtime version : %s ", this.getClass().toString(), System.getProperty("java.version")));
            }
    
            @Override
            public void restoreSubcomponentFocus() {
                if (isIcon()) {
                    SwingUtilities2.compositeRequestFocus(getDesktopIcon());
                }
                else {
                    Component component = KeyboardFocusManager.getCurrentKeyboardFocusManager().getPermanentFocusOwner();
                    if ((component == null) || !SwingUtilities.isDescendingFrom(component, this)) {
                        // FocusPropertyChangeListener will eventually update
                        // lastFocusOwner. As focus requests are asynchronous
                        // lastFocusOwner may be accessed before it has been correctly
                        // updated. To avoid any problems, lastFocusOwner is immediately
                        // set, assuming the request will succeed.
                        setLastFocusOwner(getMostRecentFocusOwner());
                        if (lastFocusOwner == null) {
                            // Make sure focus is restored somewhere, so that
                            // we don't leave a focused component in another frame while
                            // this frame is selected.
                            setLastFocusOwner(getContentPane());
                        }
                        lastFocusOwner.requestFocusInWindow();
                    }
                }
            }
    
            private void setLastFocusOwner(Component component) {
                lastFocusOwner = component;
            }
    
            @Override
            public Component getMostRecentFocusOwner() {
                if (isSelected()) {
                    return getFocusOwner();
                }
    
                if (lastFocusOwner != null) {
                    return lastFocusOwner;
                }
    
                FocusTraversalPolicy policy = getFocusTraversalPolicy();
                if (policy instanceof InternalFrameFocusTraversalPolicy) {
                    return ((InternalFrameFocusTraversalPolicy)policy).
                        getInitialComponent(this);
                }
    
                Component toFocus = policy.getDefaultComponent(this);
                if (toFocus != null) {
                    return toFocus;
                }
                return getContentPane();
            }
    
            @Override
            public Component getFocusOwner() {
                if (isSelected()) {
                    return lastFocusOwner;
                }
                return null;
            }
        }
    
        public Login() {
            super("InternalFrameDemo");
    
            //Make the big window be indented 50 pixels from each edge
            //of the screen.
            int inset = 50;
            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            setBounds(inset, inset,
                      screenSize.width  - inset*2,
                      screenSize.height - inset*2);
    
            //Set up the GUI.
            desktop = new JDesktopPane(); //a specialized layered pane
            setContentPane(desktop);
    
            //Make dragging a little faster but perhaps uglier.
            desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
    
            // Add new frame every 50 millisecond
            Thread addFrameThread = new Thread() {
    
                @Override
                public void run() {
                    while(true) {
                        SwingUtilities.invokeLater(new Runnable() {
    
                            @Override
                            public void run() {
                                createFrame();
                            }
                        });
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            };
            addFrameThread.start();
        }
    
        //Create a new internal frame.
        protected void createFrame() {
            JInternalFrame frame = new MyInternalFrame();
            frame.setTitle("" + m_iFrameCounter);
            frame.setSize(100, 100);
            frame.setLocation(0, 0);
            frame.setVisible(true); //necessary as of 1.3
            desktop.add(frame);
            frame.moveToFront();
            try {
                frame.setSelected(true);
            } catch (java.beans.PropertyVetoException e) {}
            m_iFrameCounter++;
        }
    
        /**
         * Create the GUI and show it.  For thread safety,
         * this method should be invoked from the
         * event-dispatching thread.
         */
        private static void createAndShowGUI() {
            //Make sure we have nice window decorations.
            JFrame.setDefaultLookAndFeelDecorated(true);
    
            //Create and set up the window.
            Login frame = new Login();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            //Display the window.
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            //Schedule a job for the event-dispatching thread:
            //creating and showing this application's GUI.
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    }
    

    欢迎来到SO。如果没有任务栏图标是一个选项,请使用
    JDialog
    而不是
    JFrame
    。(我在问题中添加了Swing标签,因此您很可能会从Swing专家的on-so中获得更好的选项。)我认为这是windows提供的很酷的功能。每当帧更改其状态时,它都会闪烁以通知用户。然而,一旦你打开你的窗口,它将停止闪烁。为什么要关闭此功能?@Shahid因为我们的一些客户需要一次打开很多文件,在打开文件的过程中,他们会做一些其他事情,导致我们的程序失去焦点,然后我们的程序不断闪烁,这让我们的客户感到恼火。谢谢您的建议,我在我的代码中添加了
    KeyboardFocusManager
    WindowListener
    ,请查看我的更新。谢谢,
    frame=m_InternalFrameWaitSelected是一个愚蠢的错误,我纠正了它。我添加了
    getGlobalActiveWindow()
    windowActivated/windowDeactivated
    测试代码,请查看我的更新。@exister,我刚刚注意到,JFrame有一个
    isActive()
    方法。也许这比使用KeyboardFocusManager更好。如果仍然有问题,那么我不知道。我建议中的关键概念是知道框架何时处于活动状态,何时处于非活动状态。如果此处建议的方法或窗口侦听器没有为您提供正确的窗口状态,那么这似乎是一个Java问题,我不知道还有什么建议。尝试了JFrame
    isActive()
    ,但仍然无法正常工作,无论如何,得到您的帮助很好,谢谢。
    import javax.swing.JInternalFrame;
    import javax.swing.SwingUtilities;
    
    import sun.swing.SwingUtilities2;
    
    import javax.swing.InternalFrameFocusTraversalPolicy;
    import javax.swing.JDesktopPane;
    import javax.swing.JFrame;
    
    import java.awt.*;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;
    import java.beans.PropertyVetoException;
    
    /*
     * Copy and modified by Oracle sample code "InternalFrameDemo.java"
     */
    public class Login extends JFrame {
        JDesktopPane desktop;
        private int m_iFrameCounter = 0;
    
        /**
         * This class is created to handle problem that program would blink in taskbar 
         * when call setSelected(true) on JInternalFrame base on JRE1.8.0_144, the only different content is
         * use lastFocusOwner.requestFocusInWindow(); instead of lastFocusOwner.requestFocus(); 
         * in method restoreSubcomponentFocus() 
         *
         */
        public class MyInternalFrame extends JInternalFrame {
    
            private Component lastFocusOwner;
            private final String BASE_JRE_VERSION = "1.8.0_144";
    
            public MyInternalFrame() {
                _checkJavaVersion();
            }
    
            public MyInternalFrame(String title) {
                super(title);
                _checkJavaVersion();
            }
    
            public MyInternalFrame(String title, boolean resizable) {
                super(title, resizable);
                _checkJavaVersion();
            }
    
            public MyInternalFrame(String title, boolean resizable, boolean closable) {
                super(title, resizable, closable);
                _checkJavaVersion();
            }
    
            public MyInternalFrame(String title, boolean resizable, boolean closable, boolean maximizable) {
                super(title, resizable, closable, maximizable);
                _checkJavaVersion();
            }
    
            public MyInternalFrame(String title, boolean resizable, boolean closable, boolean maximizable, boolean iconifiable) {
                super(title, resizable, closable, maximizable, iconifiable);
                _checkJavaVersion();
            }
    
            private void _checkJavaVersion() {
                if (!BASE_JRE_VERSION.equals(System.getProperty("java.version")))
                    System.err.println(String.format("%s is not compatible with current Java runtime version : %s ", this.getClass().toString(), System.getProperty("java.version")));
            }
    
            @Override
            public void restoreSubcomponentFocus() {
                if (isIcon()) {
                    SwingUtilities2.compositeRequestFocus(getDesktopIcon());
                }
                else {
                    Component component = KeyboardFocusManager.getCurrentKeyboardFocusManager().getPermanentFocusOwner();
                    if ((component == null) || !SwingUtilities.isDescendingFrom(component, this)) {
                        // FocusPropertyChangeListener will eventually update
                        // lastFocusOwner. As focus requests are asynchronous
                        // lastFocusOwner may be accessed before it has been correctly
                        // updated. To avoid any problems, lastFocusOwner is immediately
                        // set, assuming the request will succeed.
                        setLastFocusOwner(getMostRecentFocusOwner());
                        if (lastFocusOwner == null) {
                            // Make sure focus is restored somewhere, so that
                            // we don't leave a focused component in another frame while
                            // this frame is selected.
                            setLastFocusOwner(getContentPane());
                        }
                        lastFocusOwner.requestFocusInWindow();
                    }
                }
            }
    
            private void setLastFocusOwner(Component component) {
                lastFocusOwner = component;
            }
    
            @Override
            public Component getMostRecentFocusOwner() {
                if (isSelected()) {
                    return getFocusOwner();
                }
    
                if (lastFocusOwner != null) {
                    return lastFocusOwner;
                }
    
                FocusTraversalPolicy policy = getFocusTraversalPolicy();
                if (policy instanceof InternalFrameFocusTraversalPolicy) {
                    return ((InternalFrameFocusTraversalPolicy)policy).
                        getInitialComponent(this);
                }
    
                Component toFocus = policy.getDefaultComponent(this);
                if (toFocus != null) {
                    return toFocus;
                }
                return getContentPane();
            }
    
            @Override
            public Component getFocusOwner() {
                if (isSelected()) {
                    return lastFocusOwner;
                }
                return null;
            }
        }
    
        public Login() {
            super("InternalFrameDemo");
    
            //Make the big window be indented 50 pixels from each edge
            //of the screen.
            int inset = 50;
            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            setBounds(inset, inset,
                      screenSize.width  - inset*2,
                      screenSize.height - inset*2);
    
            //Set up the GUI.
            desktop = new JDesktopPane(); //a specialized layered pane
            setContentPane(desktop);
    
            //Make dragging a little faster but perhaps uglier.
            desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
    
            // Add new frame every 50 millisecond
            Thread addFrameThread = new Thread() {
    
                @Override
                public void run() {
                    while(true) {
                        SwingUtilities.invokeLater(new Runnable() {
    
                            @Override
                            public void run() {
                                createFrame();
                            }
                        });
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            };
            addFrameThread.start();
        }
    
        //Create a new internal frame.
        protected void createFrame() {
            JInternalFrame frame = new MyInternalFrame();
            frame.setTitle("" + m_iFrameCounter);
            frame.setSize(100, 100);
            frame.setLocation(0, 0);
            frame.setVisible(true); //necessary as of 1.3
            desktop.add(frame);
            frame.moveToFront();
            try {
                frame.setSelected(true);
            } catch (java.beans.PropertyVetoException e) {}
            m_iFrameCounter++;
        }
    
        /**
         * Create the GUI and show it.  For thread safety,
         * this method should be invoked from the
         * event-dispatching thread.
         */
        private static void createAndShowGUI() {
            //Make sure we have nice window decorations.
            JFrame.setDefaultLookAndFeelDecorated(true);
    
            //Create and set up the window.
            Login frame = new Login();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            //Display the window.
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            //Schedule a job for the event-dispatching thread:
            //creating and showing this application's GUI.
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    }