Reputation: 3566
Just have a look on this block of code:
public Reminder() {
a[0]=1000;
a[1]=3000;
a[2]=1000;
a[3]=5000;
timer = new Timer();
timer.schedule(new RemindTask(),0, a[i]);
}
//////////////////////
class RemindTask extends TimerTask {
public void run() {
point =point +arr[i].length();
doc.setCharacterAttributes(0,point+1, textpane.getStyle("Red"), true);
i++;
}
}
I want delay to be changed after each task,so the timings are stored in an array.
When i++
is preformed(pointer to array),the timings are not changed;the subsequent rate of delay is same as the first delay value.Why it dosn't change?
EDIT:
Here's an SSCCE if required:
import java.awt.Color;
import java.lang.reflect.InvocationTargetException;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
public class Reminder {
static JFrame frame;
Toolkit toolkit;
Timer timer;
int point=0;
static StyledDocument doc;
static JTextPane textpane;
String[] arr={"Tes"," hiiii"," what"," happpn"};
public int i=0;
long[] a=new long[4];
public Reminder() {
a[0]=1000;
a[1]=3000;
a[2]=1000;
a[3]=5000;
timer = new Timer();
timer.schedule(new RemindTask(),0, a[i]);
}
class RemindTask extends TimerTask {
public void run() {
point =point +arr[i].length();
doc.setCharacterAttributes(0,point+1, textpane.getStyle("Red"), true);
i++;
}
}
public static void newcompo()
{
JPanel panel = new JPanel();
doc = (StyledDocument) new DefaultStyledDocument();
textpane = new JTextPane(doc);
textpane.setText("Test hiiii what happpn");
javax.swing.text.Style style = textpane.addStyle("Red", null);
StyleConstants.setForeground(style, Color.RED);
panel.add(textpane);
frame.add(panel);
frame.pack();
}
public static void main(String args[]) throws InterruptedException, InvocationTargetException {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
newcompo();
}
});
Reminder aa= new Reminder();
}
}
Upvotes: 0
Views: 552
Reputation: 159784
When using Swing, better to use javax.swing.Timer
over javax.util.Timer
. That will give you the setDelay
method:
timer = new Timer(0, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (i > a.length) { // check when to stop
timer.stop();
return;
}
point = point + arr[i].length();
doc.setCharacterAttributes(0, point + 1, textpane.getStyle("Red"), true);
i++;
// Change delay period
timer.setDelay(a[i]);
}
});
timer.setDelay(a[0]);
timer.start();
This will required you to change the type of your delay array a
, from
long[] a = new long[4];
to this:
int[] a = new int[4];
Upvotes: 4
Reputation: 3938
Into your run(), you need to cancel the old timer and re-run a new one, something like (untested):
public void run() {
...
timer.cancel(); // Terminate the timer thread.
timer = new Timer();
timer.schedule(new RemindTask(), 0, a[i]);
}
And of course, it's probably better to specify the initial delay instead:
timer.schedule(new RemindTask(), a[i]);
Upvotes: 0
Reputation: 3938
A second method would be to schedule your run() every second but return without doing nothing when it's not the time to perform the next action.
Upvotes: 0