Как показать загрузочный JFrame с помощью JProgressBar

Я новичок в Java. Я кодировал приложение, которое загружает JTable с данными из базы данных доступа. Я также сделал подкласс SwingWorker для загрузки даты Jtable в фоновом режиме, которая обозначена индикатором выполнения, как показано ниже:

/**
 *
 * @author Mike
 */
public class StockProgressBar extends JPanel {

    private final JProgressBar progressBar;
    private final JDialog progressDialog;

    public StockProgressBar() {
        Window thisWin = SwingUtilities.getWindowAncestor(this);
        progressDialog = new JDialog(thisWin, "Please Wait...");

        progressBar = new JProgressBar(0, 100);
        progressBar.setBorder(BorderFactory.createEmptyBorder(5, 50, 0, 50));
        progressBar.setValue(0);
        progressBar.setIndeterminate(true);

        JPanel contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(20, 10, 20, 10));
        contentPane.setPreferredSize(new Dimension(300, 100));
        contentPane.add(progressBar);

        progressDialog.setContentPane(contentPane);
        progressDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        progressDialog.setIconImage(Toolkit.getDefaultToolkit().getImage(
                this.getClass().getResource("Resources/Load.png")));

        progressDialog.pack();
        progressDialog.setLocationRelativeTo(null);

        progressDialog.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent evt) {
                System.exit(0);
            }
        });
        final Task task = new Task("StockControl");
        task.addPropertyChangeListener(new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                if (evt.getPropertyName().equalsIgnoreCase("progress")) {
                    int progress = (Integer) evt.getNewValue();
                    if (progress == 0) {
                        progressBar.setIndeterminate(true);
                    } else {
                        progressBar.setIndeterminate(false);
                        progressBar.setString(null);
                        progressBar.setValue(progress);
                        progressDialog.dispose();
                    }
                }
            }
        });
        progressDialog.setVisible(true);
        task.execute();

    }

    private class Task extends SwingWorker<Void, Void> {

        private static final int SLEEP_TIME = 1000;
        private String text;

        public Task(String text) {
            this.text = text;
        }

        @Override
        public Void doInBackground() {
            Random random = new Random();
            int progress = 0;
            setProgress(0);
            try {
                Thread.sleep(random.nextInt(SLEEP_TIME));
            } catch (InterruptedException e) {
                System.err.println(e.getMessage());
            }
            new StockHome().setVisible(true);//I would like to show that this JFrame is loading
            progress += random.nextInt(10);
            setProgress(Math.min(progress, 100));
            return null;
        }

        @Override
        public void done() {
            System.out.println(text + " is done Loading");
            Toolkit.getDefaultToolkit().beep();
        }
    }
}

Это правильный способ сделать это или есть лучший способ?

0 ответов

Другие вопросы по тегам