Java 将进度条添加到Swing项目
我为这项工作重新设计了代码。应用程序的最后情况如下所示 GUI类 第二类:工作人员Java 将进度条添加到Swing项目,java,swing,constructor,progress-bar,swingworker,Java,Swing,Constructor,Progress Bar,Swingworker,我为这项工作重新设计了代码。应用程序的最后情况如下所示 GUI类 第二类:工作人员 package exampleproject; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.SwingWo
package exampleproject;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.SwingWorker;
public class MySwingWorker extends SwingWorker<Void, Void> {
private GUI myGui; //Reach GUI variables.
public MySwingWorker(GUI myGui) {
this.myGui = myGui;
}
private MySwingWorker swing;
public MySwingWorker() {
this.swing = swing;
}
//get start date from GUI and convert it wanted format.
public String getStartDate (){
String inputStringDate = myGui.StartDateComboBox.getText();
SimpleDateFormat inputFormat = new SimpleDateFormat("dd.MM.yyyy");
Date inputDate = null;
try {
inputDate = inputFormat.parse(inputStringDate);
}
catch (ParseException ex) {
Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
}
SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd 00:00:00.000");
String outputStringDate = outputFormat.format(inputDate);
return outputStringDate;
}
//get end date from GUI and convert it wanted format.
public String getEndDate (){
String inputStringDate = myGui.EndDateComboBox.getText();
SimpleDateFormat inputFormat = new SimpleDateFormat("dd.MM.yyyy");
Date inputDate = null;
try {
inputDate = inputFormat.parse(inputStringDate);
}
catch (ParseException ex) {
Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
}
SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd 23:59:59.999");
String outputStringDate = outputFormat.format(inputDate);
return outputStringDate;
}
@Override
protected Void doInBackground() throws Exception {
int i = 0;
setProgress(i);
String test1 = "Starting Date: '"+getStartDate()+"'"; //LongTask 1
System.out.println(test1);
while(i < 50){
setProgress(i++);
Thread.sleep(5); // random magic number
}
String test2 = "Ending Date: '"+getEndDate()+"'"; //LongTask 2
System.out.println(test2);
while(i < 100){
setProgress(i++);
Thread.sleep(5); // random magic number
}
return null;
}
}
当程序启动时,GUI屏幕出现在屏幕上,用户选择两个日期并按GO buton
当我按下按钮时,Swingworker成功地从GUI屏幕获取用户选择的值,并将结果打印到屏幕上。我只是想把进度监视器添加到这个项目中
我只想在GUI上点击GO按钮时,屏幕上会出现一个进度监视器,并显示工作人员的状态。但我不知道如何在这个项目中实施全新的progressmonitor框架,并说“听工人的话”
谢谢。这与您以前的类似。我建议你使用SwingWorker,你做到了,很好 但是你没有注意到这一点。我用。在我在匿名类中使用的代码中。 当您调用swingWorker
setProgress
asprogress
时,它是一个绑定属性,然后当您使用setProgress
its更改该值时,它会通知它的所有侦听器
我给你举了个简单的例子
public class GUI {
private JPanel panel;
private JProgressBar progressBar;
private JButton button;
public GUI(){
panel = new JPanel();
progressBar = new JProgressBar();
button = new JButton("Press me");
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
SwingWorker worker = new MySwingWorker();
worker.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(final PropertyChangeEvent event) {
switch (event.getPropertyName()) {
case "progress":
progressBar.setIndeterminate(false);
progressBar.setValue((Integer) event.getNewValue());
break;
}
}
});
//then to get start you have to use execute()
worker.execute();
}
});
panel.add(progressBar);
panel.add(button);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI("SwingWorker Example");
}
});
}
private static void createAndShowGUI(String str) {
JFrame frame = new JFrame(str);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.add(new GUI().panel);
frame.pack();
frame.setVisible(true);
}
static class MySwingWorker extends SwingWorker<Void,Void>{
@Override
protected Void doInBackground() throws Exception{
//here you make heavy task this is running in another thread not in EDT
int i = 0;
setProgress(i);
// call query 1
while(i < 50){
setProgress(i++);
Thread.sleep(5); // random magic number
}
// then call query 2
while(i <= 100){
setProgress(i++);
Thread.sleep(5); // random magic number
}
return null;
}
}
}
公共类GUI{
私人JPanel小组;
私人JProgressBar progressBar;
私人按钮;
公共图形用户界面(){
panel=新的JPanel();
progressBar=新的JProgressBar();
按钮=新按钮(“按我”);
addActionListener(新建ActionListener()){
@凌驾
已执行的公共无效操作(操作事件e){
SwingWorker worker=新的MySwingWorker();
worker.addPropertyChangeListener(新的PropertyChangeListener(){
@凌驾
公共作废属性更改(最终属性更改事件){
开关(event.getPropertyName()){
案例“进展”:
progressBar.SetUndeterminate(假);
progressBar.setValue((整数)event.getNewValue());
打破
}
}
});
//然后要开始,必须使用execute()
worker.execute();
}
});
面板。添加(进度条);
面板。添加(按钮);
}
公共静态void main(字符串[]args){
//为事件调度线程计划作业:
//创建并显示此应用程序的GUI。
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
createAndShowGUI(“SwingWorker示例”);
}
});
}
私有静态void createAndShowGUI(字符串str){
JFrame=新JFrame(str);
frame.setDefaultCloseOperation(关闭时退出);
frame.add(新GUI().panel);
frame.pack();
frame.setVisible(true);
}
静态类MyWingWorker扩展了SwingWorker{
@凌驾
受保护的Void doInBackground()引发异常{
//在这里,您需要执行繁重的任务,这是在另一个线程中运行的,而不是在EDT中
int i=0;
环境运输及工程署(一);
//呼叫查询1
而(i<50){
setProgress(i++);
Thread.sleep(5);//随机幻数
}
//然后调用查询2
虽然(我再次编辑了我的代码,你可以在下面签入。但是当我点击buton worker not executed and progressbar这次不来了。我怀疑progressbar没有被解雇。我错了吗?@Lacrymae这不是stackoverflow的工作方式,你应该编辑你的问题,这部分是为了答案而不是问题,删除你的答案并编辑你。)r问题!如果你不写一篇好的(可读的)文章,我不明白你的问题是什么问题。哦,好的,我明白了,我现在删除答案并编辑我的问题。编辑:好的,我删除了我的答案并编辑了上面的问题。你可以检查我项目的最后一个情况及其问题。@Lacrymae我不明白你的自定义进度条,它根本没有必要。你应该提供GUI类中的代码,我建议你使用JProgressBar
直接!嗯,你们提供在主GUI中创建新的Jprogressbar,对吗?问题解决了:我将Swingworker类和ProgressBar类带到我的主GUI类中。所以我不再需要使用costructor,现在一切正常。问题是:当Swingworker类在主GUI类中创建时,我们必须使用构造函数。
public class GUI {
private JPanel panel;
private JProgressBar progressBar;
private JButton button;
public GUI(){
panel = new JPanel();
progressBar = new JProgressBar();
button = new JButton("Press me");
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
SwingWorker worker = new MySwingWorker();
worker.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(final PropertyChangeEvent event) {
switch (event.getPropertyName()) {
case "progress":
progressBar.setIndeterminate(false);
progressBar.setValue((Integer) event.getNewValue());
break;
}
}
});
//then to get start you have to use execute()
worker.execute();
}
});
panel.add(progressBar);
panel.add(button);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI("SwingWorker Example");
}
});
}
private static void createAndShowGUI(String str) {
JFrame frame = new JFrame(str);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.add(new GUI().panel);
frame.pack();
frame.setVisible(true);
}
static class MySwingWorker extends SwingWorker<Void,Void>{
@Override
protected Void doInBackground() throws Exception{
//here you make heavy task this is running in another thread not in EDT
int i = 0;
setProgress(i);
// call query 1
while(i < 50){
setProgress(i++);
Thread.sleep(5); // random magic number
}
// then call query 2
while(i <= 100){
setProgress(i++);
Thread.sleep(5); // random magic number
}
return null;
}
}
}