Affichage d'une barre de progression indéterminée lors de l'exécution d'un fichier batch
Dans les applications de bureau, il est crucial de fournir un retour visuel aux utilisateurs lorsque des tâches longues sont en cours. Lors de l'exécution de fichiers batch en arrière-plan, un problème courant survient : l'écran apparaît inactif, laissant les utilisateurs ne sachant pas si le programme est toujours en cours d'exécution. Pour résoudre ce problème, l'affichage d'une barre de progression indéterminée peut atténuer la confusion et améliorer l'expérience utilisateur.
Défis liés à Swing
Swing est une boîte à outils d'interface graphique Java populaire, mais elle est confrontée à limitations lors de la gestion de plusieurs processus et de la mise à jour des éléments de l'interface utilisateur à partir de threads non EDT. Bien qu'il soit possible d'utiliser un SwingWorker pour exécuter des tâches en arrière-plan, il n'est pas conçu pour gérer la sortie du fichier batch.
Une meilleure solution utilisant ProcessBuilder
ProcessBuilder propose une approche plus robuste. Vous pouvez exécuter le fichier batch en arrière-plan à l'aide de ProcessBuilder.start(), puis surveiller sa progression et obtenir sa sortie via des flux standard. De plus, en implémentant un SwingWorker, vous pouvez mettre à jour la barre de progression à partir du thread EDT, garantissant ainsi une interface graphique réactive.
Un exemple d'implémentation
L'exemple de code suivant montre comment utiliser ProcessBuilder avec SwingWorker pour afficher une barre de progression indéterminée lors de l'exécution d'un fichier batch :
import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import javax.swing.*; public class BatchFileProgress { private final JLabel statusLabel = new JLabel("Status: ", JLabel.CENTER); private final JTextArea textArea = new JTextArea(20, 20); private JButton startButton = new JButton("Start"); private JButton stopButton = new JButton("Stop"); private JProgressBar bar = new JProgressBar(); private BackgroundTask backgroundTask; private final ActionListener buttonActions = new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { JButton source = (JButton) ae.getSource(); if (source == startButton) { textArea.setText(null); startButton.setEnabled(false); stopButton.setEnabled(true); backgroundTask = new BackgroundTask(); backgroundTask.execute(); bar.setIndeterminate(true); } else if (source == stopButton) { backgroundTask.cancel(true); backgroundTask.done(); } } }; private void displayGUI() { JFrame frame = new JFrame("Batch File Progress"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); JPanel panel = new JPanel(); panel.setBorder( BorderFactory.createEmptyBorder(5, 5, 5, 5)); panel.setLayout(new BorderLayout(5, 5)); JScrollPane sp = new JScrollPane();
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!