Почему setExtendedState (JFrame . ICONIFIED) не работает при заблокированном экране Windows?ICONIFIED) не работает при заблокированном экране Windows?

#java #swing #minimize

#java #swing #свернуть

Вопрос:

все. я хочу минимизировать свой jframe с помощью setExtendedState (JFrame. ICONIFIED).В большинстве случаев он работает должным образом, но когда он не работает, когда я блокирую экран своей ОС (windows XP) с помощью WIN L.Мой код wimple выглядит следующим образом:

 import javax.swing.JDialog;
import javax.swing.JFrame;

public class FrameTest extends JFrame {
    public static FrameTest ft = new FrameTest();

    public static void main(String[] args)
    {
        FrameTest.ft.setVisible(true);
        FrameTest.ft.setLocation(300, 300);
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        JDialog dlg = new JDialog( ft, "xxx", true );
        ft.setExtendedState(JFrame.ICONIFIED);
        dlg.setVisible(true);//if not have this line, it works also in screen lock case 
    }   
}
  

Мы будем признательны за любую помощь.

Комментарии:

1. Имеет ли для вас какое-либо значение термин «взламывание блокировки»? Похоже, именно это пытается сделать ваш код.

2. Системный экран заблокирован автоматически. Я просто хочу знать, почему родительский фрейм отображается нормально, но не сворачивается после блокировки системного экрана. Какие-либо конкретные советы?

Ответ №1:

Возможно, вы манипулируете компонентами Swing из основного потока вместо потока отправки событий. Попробуйте обернуть содержимое main в:

 public static void main(String[] args)
{
SwingUtilities.invokeLater(new Rennable() {
    @Override
    void run() {
        FrameTest.ft.setVisible(true);
        FrameTest.ft.setLocation(300, 300);
    }
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    SwingUtilities.invokeLater(new Rennable() {
        @Override
        void run() {
            JDialog dlg = new JDialog( ft, "xxx", true );
            ft.setExtendedState(JFrame.ICONIFIED);
            dlg.setVisible(true);case 
     }   
}
  

Если это не помогает, попробуйте разделить второй invokeLater блок на:

     SwingUtilities.invokeLater(new Rennable() {
        @Override
        void run() {
            ft.setExtendedState(JFrame.ICONIFIED);
     }   
    SwingUtilities.invokeLater(new Rennable() {
        @Override
        void run() {
            JDialog dlg = new JDialog( ft, "xxx", true );
            dlg.setVisible(true);case 
     }   
  

Это дает Swing возможность отреагировать на значок, прежде чем передавать управление диалоговому окну.