Как сделать фрейм всегда поверх моей программы только с многопоточностью - PullRequest
0 голосов
/ 22 апреля 2019
  1. У меня есть тема # 1.Он показывает MainFrame.

  2. Затем я запускаю пул потоков для выполнения некоторых задач. Поток # 1 должен ждать завершения пула потоков .Мне нужно показать PopupDialog, который сообщает, что сейчас задачи выполняются.PopupDialog должен быть ВСЕГДА только поверх моей программы.

  3. После завершения всех задач PopupDialog должен быть закрыт, и поток # 1 может продолжить его выполнение.

Как я могу это сделать?

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

/**
 * @see https://stackoverflow.com/questions/24361899/frame-always-on-top-of-my-program-only
 */

public class TopTest {
private static JFrame mainFrame;

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            mainFrame = new JFrame("test");
            mainFrame.setSize(800, 600);
            mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            mainFrame.setVisible(true);

            final PopupDialog popupDialog = new PopupDialog();
            mainFrame.addWindowListener(new WindowAdapter() {
                /**
                 * {@inheritDoc}
                 */
                @Override
                public void windowDeactivated(WindowEvent e) {
                    popupDialog.setAlwaysOnTop(false);
                }

                /**
                 * {@inheritDoc}
                 */
                @Override
                public void windowActivated(WindowEvent e) {
                    popupDialog.setAlwaysOnTop(true);
                }
            });
            startOtherThreads();
            WindowEvent windowClosing = new WindowEvent(popupDialog, WindowEvent.WINDOW_CLOSING);
            popupDialog.dispatchEvent(windowClosing);
        }
    });
}

public static void startOtherThreads() {

    int NUM_THREADS = 8;
    ExecutorService es = Executors.newFixedThreadPool(NUM_THREADS);

    for (int i = 0; i < 5; i++) {
        Task task = new Task();
        es.execute(task); // submit that to be done
    }

    awaitTerminationAfterShutdown(es);

}

static class Task implements Runnable {

    public Task() {
    }

    @Override
    public void run() {

        System.out.println("Each thread waiting for 10 sec");
        try { 
              Thread.sleep(10000);
            } catch(InterruptedException ex) {
              Thread.currentThread().interrupt();
        }
    }
}

public static void awaitTerminationAfterShutdown(ExecutorService threadPool) {
    threadPool.shutdown();
    try {
        if (!threadPool.awaitTermination(300, TimeUnit.SECONDS)) {
            threadPool.shutdownNow();
        }
    } catch (InterruptedException ex) {
        threadPool.shutdownNow();
        Thread.currentThread().interrupt();
    }
}

public static class PopupDialog extends JDialog {

    public PopupDialog() {
        super(mainFrame);

        JLabel label = new JLabel("Waiting for thread pool completion...");
        getContentPane().add(label, BorderLayout.CENTER);
        setAlwaysOnTop(true);
        setFocusable(false);
        setPreferredSize(new Dimension(300, 100));
        pack();
        setLocationRelativeTo(mainFrame);
        setVisible(true);
    }
}
}

На данный момент PopupDialog находится над всеми программами (я не могу слушать поток № 1, когда все другие потоки работают).И PopupDialog не показывает его содержимое.

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