如何解决从SwingWorker更新JProgressBar
我是Java的新手,正在尝试构建一个从JSwing TextField接收6个输入的应用程序。 我有大约5个复选框。根据选择,一些详细信息将从数据库中获取。 所有其他东西现在都在工作,但是我想放置一个进度条,该进度条会根据进度更新值。我尝试跨复选框手动将带有progressBar.setValue(0)的ProgressBars更新为progressBar.setValue(100)。但是它没有更新。在在线浏览了一些文章之后,我发现此链接中使用了swing worker。我尝试了罗宾的解决方案。 How do I make my SwingWorker example work properly?。它会创建一个单独的对话框,但是它是空的。
是否可以在程序中设置进度条更新?
jButton1 = new javax.swing.JButton();
jButton1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
progressBar.setValue(0);
if(Sizing_details.isSelected()) {
progressBar.setValue(20);
}
然后我尝试通过我提到的链接使用swing worker。
public void actionPerformed(ActionEvent e) {
new GuiWorker().execute();
对话框被弹出,没有任何显示。但是从功能角度来看,它是可行的。您能帮我解决这个问题吗?
我有两个问题。
- 每当我在“提交”按钮操作下的复选框中设置进度条时,是否可以手动更新它们。 ?
- 如果我必须使用swing worker,是否可以在同一帧中添加进度条并对其进行操作。
编辑我:
我可以弹出进度栏。但是,当我从下面的链接调用“ go”方法时 SwingWorker ProgressBar
java.awt.EventQueue.invokelater(new Runnable() {
public void run() { go();
try {
new JFrame_Demo().setVisible(true);
jButton1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
上面的代码有效。它会初始化进度条。
java.awt.EventQueue.invokelater(new Runnable() {
public void run() {
try {
new JFrame_Demo().setVisible(true);
jButton1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
go();
import java.awt.Color;
import java.awt.Dialog;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.sqlException;
import java.util.ArrayList;
import java.util.Collection;
import javax.swing.AbstractAction;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.SwingWorker;
import javax.swing.event.ChangeEvent;
import javax.swing.event.changelistener;
import org.apache.poi.hssf.usermodel.hssfWorkbook;
import com.ibm.java.diagnostics.utils.plugins.Container;
import com.ibm.jvm.trace.format.api.Component;
import com.sun.tools.javac.util.List;
import javax.swing.JToolBar;
import javax.swing.JComboBox;
import javax.swing.jdialog;
import javax.swing.JFrame;
import javax.swing.JCheckBox;
import dbutility.*;
public class JFrame_Demo extends javax.swing.JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* Creates new form JFrame_Demo
* @throws IOException
* @throws FontFormatException
* @throws InterruptedException
*/
public JFrame_Demo() throws FontFormatException,IOException,InterruptedException {
setTitle("Database Statistics Execution");
initComponents();
getContentPane().setBackground(Color.WHITE);
setBackground(Color.white);
setResizable(false);
setSize(800,800);
pack();
setVisible(true);
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
* @throws IOException
* @throws FontFormatException
* @throws InterruptedException
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() throws FontFormatException,InterruptedException {
Font customFont = Font.createFont(Font.TRUETYPE_FONT,new File("lib\\Font\\3ds_Regular.otf")).deriveFont(12f);
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
ge.registerFont(customFont);
DBUser_Input = new javax.swing.JLabel();
DBUser_Input.setFont(customFont);
DBUser_Input.setToolTipText("Database System User");
Schema = new javax.swing.JTextField();
space_user_lable = new javax.swing.JLabel();
space_user_lable.setFont(customFont);
jLabel4 = new javax.swing.JLabel();
jLabel4.setFont(customFont);
jLabel5 = new javax.swing.JLabel();
jLabel5.setFont(customFont);
Username = new javax.swing.JTextField();
Instance = new javax.swing.JTextField();
syspassword = new javax.swing.jpasswordfield();
schema_password = new javax.swing.jpasswordfield();
jButton1 = new javax.swing.JButton();
JProgressBar pb = new JProgressBar();
getContentPane().add(pb);
jButton1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e ) {
new GuiWorker().execute();
String schema = Schema.getText();
String Schema_Password = schema_password.getText();
String port = Port.getText();
String instance = Instance.getText();
String Host = host.getText();
String URL = "jdbc:oracle:thin:@"+Host+":"+port+":"+instance;
String dbpassword = syspassword.getText();
String username = Username.getText();
try {
Class.forName("oracle.jdbc.OracleDriver");
Connection con = DriverManager.getConnection(URL,username,dbpassword);
if(Exp_Schema_Check.isSelected()) {
// PROGRESS BAR TO BE SET TO 20
//Execute 20 database queries....
}
if(DB_Parameters_Sizing_Details.isSelected()) {
// PROGRESS BAR TO BE SET TO 50
//Execute 12 Database queries
}
if(Redo_Log.isSelected()) {
PROGRESS BAR TO BE SET TO 75
//... Execute 35 queries. .
}
} catch (ClassNotFoundException e1) {
// Todo Auto-generated catch block
e1.printstacktrace();
} catch (sqlException e1) {
// Todo Auto-generated catch block
e1.printstacktrace();
}
System.exit(0);
}
}
);
Exp_Schema_Check = new javax.swing.JCheckBox();
DB_Parameters_Sizing_Details = new javax.swing.JCheckBox();
DB_Parameters_Sizing_Details.setFont(customFont);
Redo_Archive_Details = new javax.swing.JCheckBox();
Redo_Archive_Details.setFont(customFont);
Session_Details = new javax.swing.JCheckBox();
Session_Details.setFont(customFont);
Tablespaces_Details = new javax.swing.JCheckBox();
Tablespaces_Details.setFont(customFont);
SPM_Performance_Details = new javax.swing.JCheckBox();
SPM_Performance_Details.setFont(customFont);
setDefaultCloSEOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
DBUser_Input.setText("Enter Database System Username");
Schema.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jTextField1ActionPerformed(evt);
}
});
space_user_lable.setText("Enter 3dspace Username");
jLabel4.setText("Enter Instance Name");
jLabel5.setText("Enter 3dspace Password");
Username.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jTextField2ActionPerformed(evt);
}
});
Instance.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jTextField4ActionPerformed(evt);
}
});
jButton1.setText("Submit");
Exp_Schema_Check.setText("Exp_Schema_Check");
Exp_Schema_Check.setFont(customFont);
DB_Parameters_Sizing_Details.setText("DB_Parameters_Sizing_Details");
Redo_Archive_Details.setText("Redo_Archive_Details");
Session_Details.setText("Session_Details");
Tablespaces_Details.setText("Tablespaces_Details");
SPM_Performance_Details.setText("SPM_Performance_Details");
JLabel Hostname = new JLabel();
Hostname.setFont(customFont);
Hostname.setText("Enter the Database Hostname");
host = new JTextField();
JLabel lblEnterTheDatabase = new JLabel();
lblEnterTheDatabase.setFont(customFont);
lblEnterTheDatabase.setText("Enter the Database Port");
Port = new JTextField();
JLabel syspass_label = new JLabel();
syspass_label.setFont(customFont);
syspass_label.setText("Enter Database System Password");
JLabel lblPoweredByDs = new JLabel();
lblPoweredByDs.setForeground(new Color(51,102,204));
lblPoweredByDs.setToolTipText("Database System User");
lblPoweredByDs.setFont(customFont);
lblPoweredByDs.setFont(customFont);
lblPoweredByDsgs = new JLabel();
lblPoweredByDsgs.setForeground(new Color(0,153,255));
lblPoweredByDsgs.setText("Powered By DSGS Infra Team");
lblPoweredByDsgs.setFont(null);
selectall = new JCheckBox("Select All");
selectall.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent arg0) {
if(selectall.isSelected()) {
Exp_Schema_Check.setSelected(true);
DB_Parameters_Sizing_Details.setSelected(true);
Redo_Archive_Details.setSelected(true);
Session_Details.setSelected(true);
SPM_Performance_Details.setSelected(true);
Tablespaces_Details.setSelected(true);
}
else if(selectall.isSelected()==false) {
Exp_Schema_Check.setSelected(false);
DB_Parameters_Sizing_Details.setSelected(false);
Redo_Archive_Details.setSelected(false);
Session_Details.setSelected(false);
SPM_Performance_Details.setSelected(false);
Tablespaces_Details.setSelected(false);
}
}
});
progressBar = new JProgressBar();
progressBar.setStringPainted(true);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
layout.setHorizontalGroup(
layout.createParallelGroup(Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(Alignment.TRAILING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(Alignment.LEADING)
.addComponent(jLabel4)
.addComponent(space_user_lable)
.addComponent(Hostname)
.addGroup(layout.createParallelGroup(Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(Alignment.LEADING)
.addComponent(DBUser_Input)
.addComponent(jLabel5))
.addGap(105)
.addGroup(layout.createParallelGroup(Alignment.TRAILING,false)
.addComponent(Username,Alignment.LEADING,GroupLayout.DEFAULT_SIZE,197,Short.MAX_VALUE)
.addComponent(Schema,172,Short.MAX_VALUE)
.addComponent(schema_password,GroupLayout.PREFERRED_SIZE,Short.MAX_VALUE)
.addComponent(Instance,Short.MAX_VALUE)
.addComponent(host,Short.MAX_VALUE)
.addComponent(syspassword,Alignment.LEADING)
.addComponent(Port,Short.MAX_VALUE)))
.addComponent(lblPoweredByDs,Alignment.TRAILING,149,GroupLayout.PREFERRED_SIZE)))
.addContainerGap(1427,Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()
.addComponent(syspass_label,1312,Short.MAX_VALUE)
.addGap(612))))
.addGroup(layout.createSequentialGroup()
.addGap(30)
.addGroup(layout.createParallelGroup(Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(selectall)
.addGap(381)
.addComponent(progressBar,GroupLayout.PREFERRED_SIZE))
.addComponent(Exp_Schema_Check)
.addComponent(DB_Parameters_Sizing_Details)
.addComponent(Redo_Archive_Details)
.addComponent(Session_Details)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(Alignment.LEADING)
.addComponent(SPM_Performance_Details)
.addComponent(Tablespaces_Details))
.addGroup(layout.createParallelGroup(Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(182)
.addComponent(jButton1))
.addGroup(layout.createSequentialGroup()
.addGap(381)
.addComponent(lblPoweredByDsgs,185,GroupLayout.PREFERRED_SIZE)))))
.addContainerGap(1161,Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(lblEnterTheDatabase,170,GroupLayout.PREFERRED_SIZE)
.addContainerGap(1754,Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(Alignment.BASELINE)
.addComponent(DBUser_Input)
.addComponent(Username,GroupLayout.PREFERRED_SIZE))
.addGap(48)
.addGroup(layout.createParallelGroup(Alignment.BASELINE)
.addComponent(syspass_label,21,GroupLayout.PREFERRED_SIZE)
.addComponent(syspassword,GroupLayout.PREFERRED_SIZE))
.addGap(58)
.addGroup(layout.createParallelGroup(Alignment.BASELINE)
.addComponent(space_user_lable)
.addComponent(Schema,GroupLayout.PREFERRED_SIZE))
.addGap(45)
.addGroup(layout.createParallelGroup(Alignment.BASELINE)
.addComponent(jLabel5)
.addComponent(schema_password,GroupLayout.PREFERRED_SIZE))
.addGap(44)
.addGroup(layout.createParallelGroup(Alignment.BASELINE)
.addComponent(jLabel4)
.addComponent(Instance,GroupLayout.PREFERRED_SIZE))
.addGap(44)
.addGroup(layout.createParallelGroup(Alignment.BASELINE)
.addComponent(Hostname)
.addComponent(host,GroupLayout.PREFERRED_SIZE))
.addGap(18)
.addGroup(layout.createParallelGroup(Alignment.LEADING)
.addComponent(lblEnterTheDatabase)
.addComponent(Port,GroupLayout.PREFERRED_SIZE))
.addPreferredGap(ComponentPlacement.RELATED,75,Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(Alignment.TRAILING)
.addComponent(progressBar,GroupLayout.PREFERRED_SIZE)
.addComponent(selectall))
.addGap(18)
.addGroup(layout.createParallelGroup(Alignment.LEADING)
.addGroup(Alignment.TRAILING,layout.createSequentialGroup()
.addComponent(Exp_Schema_Check)
.addGap(18)
.addComponent(DB_Parameters_Sizing_Details)
.addGap(18)
.addComponent(Redo_Archive_Details)
.addGap(18)
.addComponent(Session_Details)
.addGap(18)
.addComponent(SPM_Performance_Details)
.addGap(18)
.addComponent(Tablespaces_Details))
.addGroup(Alignment.TRAILING,layout.createSequentialGroup()
.addComponent(jButton1)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(lblPoweredByDsgs)))
.addGap(49)
.addComponent(lblPoweredByDs,20,GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
getContentPane().setLayout(layout);
pack();
}// </editor-fold>//GEN-END:initComponents
private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FirsT:event_jTextField1ActionPerformed
// Todo add your handling code here:
}//GEN-LAST:event_jTextField1ActionPerformed
private void jTextField2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FirsT:event_jTextField2ActionPerformed
// Todo add your handling code here:
}//GEN-LAST:event_jTextField2ActionPerformed
private void jTextField4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FirsT:event_jTextField4ActionPerformed
// Todo add your handling code here:
}//GEN-LAST:event_jTextField4ActionPerformed
/**
* @param args the command line arguments
* @return
* @return
* @throws InterruptedException
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available,stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(JFrame_Demo.class.getName()).log(java.util.logging.Level.SEVERE,null,ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(JFrame_Demo.class.getName()).log(java.util.logging.Level.SEVERE,ex);
} catch (illegalaccessexception ex) {
java.util.logging.Logger.getLogger(JFrame_Demo.class.getName()).log(java.util.logging.Level.SEVERE,ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(JFrame_Demo.class.getName()).log(java.util.logging.Level.SEVERE,ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokelater(new Runnable() {
public void run() {
try {
new JFrame_Demo().setVisible(true);
} catch (FontFormatException | IOException e) {
// Todo Auto-generated catch block
e.printstacktrace();
} catch (InterruptedException e) {
// Todo Auto-generated catch block
e.printstacktrace();
}
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton jButton1;
private javax.swing.JCheckBox Exp_Schema_Check;
private javax.swing.JCheckBox DB_Parameters_Sizing_Details;
private javax.swing.JCheckBox Redo_Archive_Details;
private javax.swing.JCheckBox Session_Details;
private javax.swing.JCheckBox Tablespaces_Details;
private javax.swing.JCheckBox SPM_Performance_Details;
private javax.swing.JLabel DBUser_Input;
private javax.swing.JLabel dbpassword1;
private javax.swing.JLabel space_user_lable;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.jpasswordfield syspassword;
private javax.swing.jpasswordfield schema_password;
private javax.swing.JTextField Schema;
private javax.swing.JTextField Username;
private javax.swing.JTextField Instance;
private JTextField host;
private JTextField Port;
hssfWorkbook workbook = new hssfWorkbook();
private JLabel lblPoweredByDsgs;
private JCheckBox selectall;
private JProgressBar progressBar;
}
非常感谢您。
解决方法
SwingWorker
用于运行长任务。这里不是这种情况,因此您不需要一个。
以下是您要实现的目标的mre (1):
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
public class SwingMain {
SwingMain() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.add(new TestPanel());
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
new SwingMain();
}
}
class TestPanel extends JPanel {
private final List<JCheckBox> checkBoxes;
public TestPanel() {
checkBoxes = new ArrayList<>();
for (int i=0; i<5; i++){
JCheckBox cb = new JCheckBox();
checkBoxes.add(cb);
add(cb);
}
JProgressBar pb = new JProgressBar();
add(pb);
JButton btn = new JButton("Check");
btn.addActionListener(evt -> pb.setValue(countCheckedBoxes()* 100/checkBoxes.size()));
add(btn);
}
private int countCheckedBoxes() {
int counter = 0;
for(JCheckBox cb : checkBoxes){
if(cb.isSelected()) {
counter++;
}
}
return counter;
}
/* a more concise version using stream:
private int countCheckedBoxes() {
return (int) checkBoxes.stream().filter(cb->cb.isSelected()).count();
}
*/
}
编辑:
如果您需要更新长时间的进度,请使用SwingWorker
:
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
public class SwingMain {
SwingMain() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.add(new TestPanel());
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
new SwingMain();
}
}
class TestPanel extends JPanel {
private final JProgressBar pb;
private final JButton btn;
public TestPanel() {
pb = new JProgressBar();
add(pb);
btn = new JButton("Run long process");
btn.addActionListener(evt -> new ProgressUpdateTask().execute());
add(btn);
}
class ProgressUpdateTask extends SwingWorker<Void,Integer> {
@Override
protected void process(List<Integer> chunks) {
int i = chunks.get(chunks.size()-1);
pb.setValue(i); // The last value in this array is all we care about.
}
@Override
protected Void doInBackground() throws Exception {
btn.setEnabled(false);
for(int i = 0; i < 100; i++) {
Thread.sleep(50); //simulate long process
publish(i);
}
btn.setEnabled(true);
return null;
}
}
}
(1)在提问和回答时,始终考虑发布MRE。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。