I'm trying to implement a progress bar that determines the (approximate) percentage of completion from another thread in Java. Right now I have the two threads running at the same time but i'm unsure of how to link to the other thread. I need it to start at 0 and by the time the other friend is finished, i want the progress bar to say 100. This is what I have so far. I've been searching almost all day for a solution but can't seem to find anything. Suggestions?
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.filechooser.FileSystemView;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.*;
import java.io.File;
public class ProgressBarTest extends JFrame {
JButton browse, search;
JTextField directory;
JProgressBar progressBar;
File file;
JList<File> results;
JScrollPane scrollPane;
// Launch the app
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
new ProgressBarTest();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
// Create the app
private ProgressBarTest() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("We are testing the JProgressBar");
browse = new JButton("Browse");
browse.setActionCommand("browse");
browse.addActionListener(new ButtonListener());
search = new JButton("Search");
search.setActionCommand("search");
search.addActionListener(new ButtonListener());
directory = new JTextField(20);
directory.setEnabled(false);
file = new File(System.getProperty("user.home"));
results = new JList<File>(file.listFiles());
results.setCellRenderer(new MyCellRenderer());
results.setLayoutOrientation(JList.HORIZONTAL_WRAP);
results.setVisibleRowCount(-1);
scrollPane = new JScrollPane(results, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setPreferredSize(new Dimension(408, 100));
progressBar = new JProgressBar(0,100);
progressBar.setValue(0);
progressBar.setStringPainted(true);
JPanel panel1 = new JPanel();
panel1.add(browse);
panel1.add(directory);
panel1.add(search);
JPanel panel2 = new JPanel();
panel2.add(scrollPane);
JPanel panel3 = new JPanel();
panel3.add(progressBar);
this.add(panel1, BorderLayout.PAGE_START);
this.add(panel2, BorderLayout.CENTER);
this.add(panel3, BorderLayout.PAGE_END);
this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);
}
private class MyCellRenderer extends DefaultListCellRenderer {
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
JLabel l = (JLabel)c;
File f = (File)value;
l.setText(f.getName());
l.setPreferredSize(new Dimension(130, 20));
l.setIcon(FileSystemView.getFileSystemView().getSystemIcon(f));
l.setBorder(new EmptyBorder(3,3,3,3));
return l;
}
}
private class ButtonListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent event) {
if(event.getActionCommand().equals("browse")) {
JFileChooser chooser = new JFileChooser(System.getProperty("user.home"));
chooser.setDialogTitle("Search what?");
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
chooser.showOpenDialog(null);
directory.setText(chooser.getSelectedFile().getPath());
} else if (event.getActionCommand().equals("search")) {
FileThread ft = new FileThread();
ft.start();
ProgressBarThread pbt = new ProgressBarThread();
pbt.start();
}
}
}
private class FileThread extends Thread {
public void run() {
file = new File(directory.getText().trim());
results.setListData(file.listFiles());
}
}
private class ProgressBarThread extends Thread {
public void run() {
for (int i = 0; i <= 100; i++) {
progressBar.setValue(i);
progressBar.setString(Integer.toString(i));
try {
Thread.sleep(50);
} catch(InterruptedException err) {
err.printStackTrace();
}
}
}
}
}
I know I'll have to take out the for loop with something that determines the percentage / time taken for the first thread. Just not sure how this is done.