Это то, что я до сих пор, это, вероятно, совершенно неправильно ...Как сделать обновляемый JProgressBar в JInternalFrame внутри потока?
Проблема, кажется, обновляя процент внутри цикла и затем вызвать его на улице в программе SwingUtilities.invokeLater
.
Также JInternalFrame
находится за остальной частью программы, возможно, лучше использовать JDialog
.
Будет здесь больше кода необходимо, также готовы опубликовать весь проект на GitHub, если вам нужна дополнительная информация. (Если это разрешено)
Это мой первый проект с кодом, так что любая помощь будет оценен по достоинству!
package twoDMapEditor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.InvocationTargetException;
import javax.swing.BorderFactory;
import javax.swing.JInternalFrame;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
public class SaveActionListener implements ActionListener {
public void actionPerformed(ActionEvent me) {
final JProgressBar progressBar = new JProgressBar();
progressBar.setValue(0);
progressBar.setStringPainted(true);
progressBar.setBorder(BorderFactory.createTitledBorder("Saving..."));
final JInternalFrame loadingDialog = new JInternalFrame();
loadingDialog.add(progressBar);
loadingDialog.pack();
loadingDialog.setVisible(true);
TwoDMapEditor.frame.add(loadingDialog);
TwoDMapEditor.frame.revalidate();
TwoDMapEditor.frame.repaint();
new Thread(new Runnable() {
public void run() {
final int percentage = 0;
int i = 0, j;
while (i < TwoDMapEditor.size[0]) {
j = 0;
while(j < TwoDMapEditor.size[1]){
if (!TwoDMapEditor.mySql.updateMapPiece(i, j)) {
System.out.println("Something went wrong");
}
//percentage = ((i * TwoDMapEditor.size[1]) + j+1) * 100/(TwoDMapEditor.size[0] * TwoDMapEditor.size[1]);
j++;
}
i++;
}
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
progressBar.setValue(percentage);
}
});
} catch (InvocationTargetException | InterruptedException e1) {
e1.printStackTrace();
}
try {
java.lang.Thread.sleep(100);
}
catch(Exception e) { }
}
}).start();
}
}
изменения: получил это прямо сейчас:
package twoDMapEditor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.BorderFactory;
import javax.swing.JInternalFrame;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
public class SaveActionListener implements ActionListener, PropertyChangeListener {
JProgressBar progressBar;
ProgressBar progressBarClass;
JInternalFrame loadingDialog;
SaveActionListener(){
progressBar = new JProgressBar();
progressBar.setValue(0);
progressBar.setStringPainted(true);
progressBar.setBorder(BorderFactory.createTitledBorder("Saving..."));
loadingDialog = new JInternalFrame();
loadingDialog.add(progressBar);
loadingDialog.pack();
loadingDialog.setVisible(true);
TwoDMapEditor.frame.add(loadingDialog);
TwoDMapEditor.frame.revalidate();
TwoDMapEditor.frame.repaint();
}
class ProgressBar extends SwingWorker<Void, Void>{
public int percentage = 1;
protected Void doInBackground(){
int i = 0, j;
while (i < TwoDMapEditor.size[0]) {
j = 0;
while(j < TwoDMapEditor.size[1]){
if (!TwoDMapEditor.mySql.updateMapPiece(i, j)) {
System.out.println("Something went wrong");
}
percentage = ((i * TwoDMapEditor.size[1]) + j+1) * 100/(TwoDMapEditor.size[0] * TwoDMapEditor.size[1]);
progressBar.setValue(percentage);
System.out.println(percentage);
j++;
}
i++;
}
return null;
}
public void done(){
loadingDialog.dispose();
}
}
public void actionPerformed(ActionEvent me) {
progressBarClass = new ProgressBar();
progressBarClass.addPropertyChangeListener(this);
progressBarClass.execute();
}
public void propertyChange(PropertyChangeEvent pce) {
System.out.println(TwoDMapEditor.saveActionListener.progressBarClass.percentage);
progressBar.setValue(TwoDMapEditor.saveActionListener.progressBarClass.percentage);
}
}
Я бы использовал «SwingWorker» для начинающих ... – MadProgrammer
Спасибо, проверите! Совершенно новые, поэтому нужно многому научиться! :) –