Ser*_*Amo 1 java user-interface swing jframe jbutton
我正在编写一个简单的java程序.它需要三个参数.包含图像的文件夹,所需的输出文件夹和图像水印文件.程序将输入文件夹中每个图像的水印图像复制到输出文件夹中.
我正在写一个简单的GUI.用户介绍三个参数并按下按钮.该程序有效,但我想向用户提供反馈.我希望每次处理图像时都能更新JLabel字段.
在我的WatermarkFolders类中,我使用此代码段向用户显示一些反馈:
Gui.FEEDBACK.setText(text);
Run Code Online (Sandbox Code Playgroud)
问题是每次处理图像时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();
}
}
Run Code Online (Sandbox Code Playgroud)
是的,需要时间的流程不应该在EDT上.而是在您同时对GUI进行更新时使用SwingWorker类来运行长时间运行的任务.
您可以使用SwingUtilities.invokeLater()方法从另一个线程更新GUI,或者您可以让Swing Timer检查任务的状态并在GUI仍然运行时更新它.
| 归档时间: |
|
| 查看次数: |
616 次 |
| 最近记录: |