Как обновить JLabel, пока процесс, инициируемый щелчком в JButton, все еще обрабатывается? - PullRequest
1 голос
/ 20 мая 2011

Я пишу простую Java-программу.Требуется три параметра.Папка, содержащая изображения, желаемая выходная папка и файл водяного знака изображения.Программа копирует изображение водяного знака каждого изображения из входной папки в выходную папку.

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

В моем классе WatermarkFolders я использую этот фрагмент кода, чтобы показать пользователю некоторую обратную связь:

Gui.FEEDBACK.setText(text);

Проблема заключается в том, что JLabel не обновляется при каждой обработке изображения.Он просто обновляется со 100% полным выводом, когда обработка завершена.Есть ли простой способ обновить это асинхронно.Спасибо за ответы.

import javax.swing.*;

import java.awt.event.*;
import java.awt.*;
import java.util.*;


public class Gui extends JPanel {
    JButton button; 
    JFileChooser chooser;
    JLabel  inputLabel  = new JLabel("Directorio donde estan las imagenes");
    JTextField  inputField  = new JTextField(15);
    JLabel  outputLabel  = new JLabel("Directorio donde guardar las copias con marca de agua");
    JTextField  outputField  = new JTextField(15);
    JLabel  watermarkLabel  = new JLabel("Archivo marca de agua (gif transparente)");
    JTextField  watermarkField  = new JTextField(15);
public static JLabel FEEDBACK  = new JLabel("Número de Imágenes: ");
    JProgressBar pb;

    public Gui() {}

    public void go() {
        JFrame frame = new JFrame("Añadir Marcas de Agua a todas las imágenes de un directorio");
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        JButton button = new JButton("Añadir Marca de Agua a las imágenes");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                String input = inputField.getText();
                String output = outputField.getText();
                String watermark = watermarkField.getText();
                if(!input.equals("") && !output.equals("") && !watermark.equals("")) {
                    WatermarkFolders wm = new WatermarkFolders(input, output, watermark);
                    wm.run();       
                }   
            }
        });
        panel.add(inputLabel);
        panel.add(inputField);      
        panel.add(outputLabel);
        panel.add(outputField);
        panel.add(watermarkLabel);
        panel.add(watermarkField);      
        panel.add(button);
        panel.add(FEEDBACK);
        frame.getContentPane().add(BorderLayout.WEST,panel);
        frame.setVisible(true);
        frame.pack(); 
    }

    public static void main(String s[]) {
        Gui gui = new Gui();
        gui.go();
    }
}

1 Ответ

8 голосов
/ 20 мая 2011

Да, процессы, которые занимают время, не должны быть в EDT.Вместо этого используйте класс SwingWorker для запуска длительной задачи при одновременном обновлении графического интерфейса.

Вы можете использовать метод SwingUtilities.invokeLater () для обновления графического интерфейса из другого потока, или вы можетеиметь Swing Timer для проверки состояния задачи и обновления графического интерфейса, пока она еще выполняется.

...