0

このコードブロックを見てください。

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++(ポインタから配列へ)、タイミングは変更されません;その後の遅延率は最初の遅延値と同じですが、なぜ変更されないのですか?

編集:

必要に応じて、SSCCEを次に示します。

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();

  }
 }
4

4 に答える 4

4

Swingを使用する場合は、以上を使用することをお勧めしjavax.swing.Timerますjavax.util.Timer。それはあなたにsetDelay方法を与えるでしょう:

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();

aこれには、遅延配列のタイプをから変更する必要があります。

long[] a = new long[4];

これに:

int[] a = new int[4];
于 2013-01-06T16:15:54.460 に答える
0

run()に、古いタイマーをキャンセルして、(テストされていない)のような新しいタイマーを再実行する必要があります。

public void run() {
   ...
timer.cancel(); // Terminate the timer thread.
timer = new Timer();
timer.schedule(new RemindTask(), 0, a[i]);
}

そしてもちろん、代わりに初期遅延を指定する方がおそらく良いでしょう:

timer.schedule(new RemindTask(), a[i]);
于 2013-01-06T16:11:47.830 に答える
0

変数iを揮発性として宣言してみてください。

于 2013-01-06T15:48:27.277 に答える
0

2番目のメソッドは、run()を毎秒スケジュールしますが、次のアクションを実行する時間でない場合は何もせずに戻ります。

于 2013-01-06T16:14:11.063 に答える