Hello I am facing few problem in combining JtextArea with JProgressBar . JtextArea is showing the console of batch running script. here is my code:-
private void initialize() {
frmPdfPublisher = new JFrame();
frmPdfPublisher.setIconImage(new ImageIcon("C:\\Users\\Admin\\Desktop\\imageedit_1_6449501097.png").getImage());
frmPdfPublisher.setTitle("PDF Publisher");
frmPdfPublisher.setBounds(100, 100, 483, 540);
frmPdfPublisher.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frmPdfPublisher.getContentPane().setLayout(null);
TextArea textArea = new TextArea();
textArea.setBounds(10, 280, 447, 146);
frmPdfPublisher.getContentPane().add(textArea);
textArea.setEditable(false);
ScrollPane scrollPane = new ScrollPane();
scrollPane.setBounds(10, 280, 447, 146);
frmPdfPublisher.getContentPane().add(scrollPane);
JProgressBar progressBar = new JProgressBar();
progressBar.setBounds(10, 254, 447, 14);
frmPdfPublisher.getContentPane().add(progressBar);
progressBar.setVisible(true);
JButton btnTransform = new JButton("Transform");
btnTransform.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
String cmds[] = {"C:\\Users/Admin/Desktop/test1.bat"};
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(cmds);
process.getOutputStream().close();
java.io.InputStream inputStream = process.getInputStream() ;
InputStreamReader inputstreamreader = new InputStreamReader(inputStream);
BufferedReader bufferedrReader = new BufferedReader(inputstreamreader);
String strLine = "";
while ((strLine = bufferedrReader.readLine()) != null) {
System.out.println(strLine);
String newline = "\n";
textArea.append(strLine+newline);
textArea.setCaretPosition(textArea.SCROLLBARS_VERTICAL_ONLY);
progressBar.setString(strLine);
}
} catch (IOException IoException) {
IoException.printStackTrace();
}
}
});
I want to show the running script in JprogressBar as well. I am using Eclipse Neon.2
EDIT:-
I had added few steps , but it is not showing perfect loading and is getting completed as soon the console is stopped.
Here is the edited code:-
JButton btnTransform = new JButton("Transform");
btnTransform.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
String cmds[] = {"C:\\Users/Admin/Desktop/test1.bat"};
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(cmds);
process.getOutputStream().close();
java.io.InputStream inputStream = process.getInputStream() ;
InputStreamReader inputstreamreader = new InputStreamReader(inputStream);
BufferedReader bufferedrReader = new BufferedReader(inputstreamreader);
String strLine = "";
int n=progressBar.getValue();
if(n<100){
n++;
progressBar.setValue(100);
}
else{
timer.cancel();
}
while ((strLine = bufferedrReader.readLine()) != null) {
System.out.println(strLine);
String newline = "\n";
textArea.append(strLine+newline);
textArea.setCaretPosition(textArea.SCROLLBARS_VERTICAL_ONLY);
progressBar.setStringPainted(true);
progressBar.dispatchEvent(e);
progressBar.getValue();
progressBar.updateUI();
}
} catch (IOException IoException) {
IoException.printStackTrace();
}
}
Kindly rectify me , what am I missing?
Right now, your
exec()
call is blocking the event dispatch thread. You'll need to run the commands in the background like they show here. If you want to see the the progress of each line in the batch file as it runs, you'll need to read the batch file line-by-line, execute each line separately andpublish()
the result like they show here. If you callsetProgress()
after each line in the background, a listening progress bar to get updated, like they show here.You'll need to read all the lines to know how many there are. Then you can set the progress like they show here:
where
i
is the current line number being executed andn
is the total number of lines. For example, if there's ten lines, the progress bar will grow by one tenth after each call.