java Flink JFrame

ulydmbyx  于 2023-01-01  发布在  Java
关注(0)|答案(3)|浏览(139)

我想创建一个具有两个特定特性的JFrame:
1.当从最小化状态最大化时,JFrame不应捕获焦点。
1.当创建JFrame或从最小化状态变为最大化时,它应该在Windows栏中 Flink ,直到用户将焦点授予它。(就像ICQ客户端x1c 0d1x中那样)。
有没有人知道如何落实第二项要求?
一个小小的自我解释的例子:

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();
            }
        });
    }
}

谢谢!

nkcskrwz

nkcskrwz1#

下面的代码完全符合您的描述:

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

f是一个JFrame。

fgw7neuy

fgw7neuy2#

不幸的是,这并不是任何Java平台都能实现的。任何人如果想通过使用你所展示的那种“技巧”来让它工作,都会失望地发现,它不太可能在其他版本的Windows上工作。甚至是另一台装有相同版本Windows的计算机。我唯一我曾经见过Java窗口 Flink 是由于Swing在将所有窗口最小化到任务栏时出现了一些小故障。
this article on making Java applications feel native所示,在Mac OS上也是如此。
你最好的选择是使用上面文章中描述的技术来创建一个JNI来调用Windows API,或者获得一个JNIWrapper(搜索它)的许可证,它可以为你做所有的事情(如果你正在制作一个商业应用程序,或者为一个愿意为这样一个特性付费的客户制作它,这是最好的选择)。
我唯一能建议的是创建一个穷人的弹出式通知系统。当你想提醒用户时,创建一个没有边框的Frame,把它放在屏幕的右下角,使它不可聚焦,并显示一小段时间。

jbose2ul

jbose2ul3#

JPanel不 Flink 。请尝试使用JPanel代替JFrame。

相关问题