Мигающий JFrame - PullRequest
       4

Мигающий JFrame

4 голосов
/ 29 ноября 2010

Я хотел бы создать 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 ]

1 голос
/ 09 декабря 2010

К сожалению, это не то, что вы можете сделать изначально на любой платформе Java.Любой, кому удастся заставить его работать, используя тот тип хитрости, который вы показали, будет разочарован, обнаружив, что он вряд ли будет работать на другой версии Windows или даже на другом компьютере с той же версией Windows.Единственный раз, когда я когда-либо видел флэш-память окна Java, из-за некоторого сбоя в Swing при сворачивании всех окон на панель задач.

Как показывает эта статья о том, как заставить приложения Java чувствовать себя нативными , показывает,то же самое в Mac OS.

Лучше всего использовать методы, описанные в приведенной выше статье, для создания JNI, который вызывает Windows API, или получить лицензию для JNIWrapper (искать его), который делает все это для вас (лучший вариант, если вы делаете коммерческое приложение или делаете это для клиента, который готов платить за такую ​​функцию).Похоже, вы можете получить 30-дневную пробную версию для этого.

Единственное, что я мог бы предложить, это создать для бедного человека эквивалент всплывающей системы уведомлений.Если вы хотите предупредить пользователя, создайте рамку без рамки, поместите ее в нижний правый угол экрана, сделайте ее не сфокусированной и покажите ее в течение короткого периода времени.

1 голос
/ 29 ноября 2010

Следующий код работал для меня именно так, как вы описали:

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

f - это JFrame.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...