java - 如何在仍在处理由 JButton 中的单击触发的进程时更新 JLabel?

标签 java swing user-interface jframe jbutton

我正在编写一个简单的 Java 程序。它需要三个参数。包含图像的文件夹、所需的输出文件夹和图像水印文件。程序将输入文件夹中每个图像的水印图像复制到输出文件夹中。

我正在编写一个简单的 GUI。用户输入三个参数并按下按钮。该程序有效,但我想向用户提供反馈。我希望能够在每次处理图像时更新 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();
    }
}

最佳答案

是的,需要时间的过程不应该在 EDT 上。而是使用 SwingWorker 类来运行长时间运行的任务,同时更新 GUI。

您可以使用 SwingUtilities.invokeLater() 方法从另一个线程更新 GUI,或者您可以让 Swing 计时器检查任务的状态并在它仍在运行时更新 GUI。

关于java - 如何在仍在处理由 JButton 中的单击触发的进程时更新 JLabel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6075517/

相关文章:

java - 特定行和列的自定义单元格渲染器

java - 更改 Java GUI 应用程序中内容的正确方法(不是每次都创建一个新窗口)?

visual-studio - 如何用 Visual C++ 编写一个简单的 GUI 应用程序

java - 两个 Eclipse UI Form 部分捕获多余的垂直空间并正确折叠?

visual-c++ - 基于 MFC 的用户界面的自动化测试

java - 如何将多个对象放在具有相同参数名称的 Map 中

java - 将整数转换为字符串的问题

java - 将数组的特定对象复制到特定位置的另一个相同类型数组的方法

java - JLayeredPane 格式问题

java - XMLTask 1.16 : Does it work with Ant so far?