package jaist.css.covis;
import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.Method;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.Timer;
/**
* 時間がかかるタスクのためのプログレスバー
* @see DBReadTask
* @see FileReadTask
*
*/
@SuppressWarnings("serial")
public class ProgressBar extends JPanel {
public final static int ONE_SECOND = 1300;
private JProgressBar progressBar;
private Timer timer;
// private JButton startButton;
private ProgressibleTask task;
private JTextArea taskOutput;
private String newline = "\n";
private Object targetobj;
private Method aftercall;
private JFrame parent;
public ProgressBar(ProgressibleTask thetask, Object obj, Method ac, JFrame p) {
super(new BorderLayout());
targetobj = obj;
aftercall = ac;
parent = p;
task = thetask;
progressBar = new JProgressBar(0, task.getLengthOfTask());
progressBar.setValue(0);
progressBar.setStringPainted(true);
taskOutput = new JTextArea(5, 20);
taskOutput.setMargin(new Insets(5, 5, 5, 5));
taskOutput.setEditable(false);
taskOutput.setCursor(null);
// inherit the panel's cursor
// see bug 4851758
// add(panel, BorderLayout.PAGE_START);
add(progressBar, BorderLayout.NORTH);
add(new JScrollPane(taskOutput), BorderLayout.SOUTH);
setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
// Create a timer.
timer = new Timer(ONE_SECOND, new ActionListener() {
public void actionPerformed(ActionEvent evt) {
progressBar.setValue(task.getCurrent());
String s = task.getMessage();
if (s != null) {
taskOutput.append(s + newline);
taskOutput.setCaretPosition(taskOutput.getDocument()
.getLength());
}
if (task.isDone()) {
// Toolkit.getDefaultToolkit().beep();
timer.stop();
// startButton.setEnabled(true);
setCursor(null); // turn off the wait cursor
// progressBar.setValue(progressBar.getMinimum());
/*
* snaillogloader.frame.dispose();
* snaillogloader.startSnailViewer(); snaillogloader.frame =
* null;
*/
parent.dispose();
parent = null;
// 登録された後処理メソッドがあれば実行.
if (aftercall == null)
return;
try {
@SuppressWarnings("rawtypes")
Class[] params = {};
@SuppressWarnings("unused")
Object ret = aftercall.invoke(targetobj,
(Object[]) params);
} catch (Exception ex) {
}
}
}
});
}
/**
* Called when the user presses the playB button.
*/
public void actionPerformed(ActionEvent evt) {
// startButton.setEnabled(false);
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
task.go();
timer.start();
}
/**
* Create the GUI and show it. For thread safety, this method should be
* invoked from the event-dispatching thread. private static void
* createAndShowGUI() { //Make sure we have nice window decorations.
* JFrame.setDefaultLookAndFeelDecorated(true);
*
* //Create and set up the window. JFrame frame = new
* JFrame("ProgressBarDemo");
* frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
*
* //Create and set up the content pane. JComponent newContentPane = new
* ProgressBar(null); newContentPane.setOpaque(true); //content panes must
* be opaque frame.setContentPane(newContentPane);
*
* //Display the window. frame.pack(); frame.setVisible(true); }
*
* public static void main(String[] args) { //Schedule a job for the
* event-dispatching thread: //creating and showing this application's GUI.
* javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() {
* createAndShowGUI(); } }); }
*/
}