public void runPushSelectedDataWithProgress() {
JDialog progressDialog = new JDialog((Frame) null, "数据推送中", true);
progressDialog.setSize(600, 400);
progressDialog.setLocationRelativeTo(null);
progressDialog.setLayout(new BorderLayout());
// 进度条
JProgressBar progressBar = new JProgressBar();
progressBar.setIndeterminate(true);
progressDialog.add(progressBar, BorderLayout.NORTH);
// 日志输出区域
JTextArea logArea = new JTextArea();
logArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(logArea);
progressDialog.add(scrollPane, BorderLayout.CENTER);
// 重定向System.out
PrintStream originalOut = System.out;
PrintStream logPrintStream = null; // 这个 PrintStream 也显式使用 UTF-8
try {
logPrintStream = new PrintStream(new OutputStream() {
private final Charset charset = Charset.forName("UTF-8"); // 可根据实际编码调整
@Override
public void write(byte[] b, int off, int len) {
String text = new String(b, off, len, charset);
SwingUtilities.invokeLater(() -> {
logArea.append(text);
logArea.setCaretPosition(logArea.getDocument().getLength());
});
}
@Override
public void write(int b) {
// 忽略单字节写,避免乱码
}
}, true, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
System.setOut(logPrintStream);
System.setErr(logPrintStream); // 同时重定向错误输出
// 后台任务
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() {
try {
xxxxxxxxxxxx(); // 调用原始方法(无需修改)
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void done() {
progressDialog.dispose(); // 关闭对话框
System.setOut(originalOut); // 恢复System.out
System.setErr(originalOut);
}
};
worker.execute();
progressDialog.setVisible(true);
}
Swing 默认风格的“不确定模式”进度条
于 2025-06-26 13:42:54 首次发布