0

Timer.util を使用すると、JLabel が JTextPane に挿入した文字列と一致しないのはなぜですか? しかし、タイマーを使用すると、整列します。データベースにTimer.utilが必要なので、遅れることはありません。

タイマースイング使用時のイメージはこちら

ここに画像の説明を入力

Timer t2 = new Timer(250,new ActionListener(){

        public void actionPerformed(ActionEvent arg0) {

            fetchMessageData2();
        }
    });
    t2.start();


public static void fetchMessage(JTextPane jtep,StyledDocument sd,int count  )
{

    try{

    String query = "SELECT members.username, message FROM chat JOIN members ON    chat.user_id = members.id WHERE message_id > "+count+"";
    rs = st.executeQuery(query);
    while(rs.next())
    {

        try {
            final JLabel jp = new JLabel(rs.getString("username")+ "\n");
            jp.setAlignmentY(0.75f);
            jp.setFont(new Font("arial",Font.BOLD,16));
            jtep.insertComponent(jp);
            sd.insertString(sd.getLength(), ": "+rs.getString("message")+ "\n", MainPanel.sas);
        } catch (BadLocationException e1) {

            e1.printStackTrace();
        }


        MainPanel.count++;}

    }catch(Exception ex){System.out.print(ex);}

}

Timer.util を使用した画像の結果を次に示します。

ここに画像の説明を入力

Timer t  = new Timer();
    t.schedule(new runnableMethods(), 0,500);

import java.util.TimerTask;


public class runnableMethods extends TimerTask{

@Override
public void run() {

    SubPanel1.checkOfflineOnline();
}
}
4

1 に答える 1

3

Swing イベント ディスパッチ スレッドである EDT で java.util.Timer を使用しないでください。これは、Swing での使用がスレッド セーフではないためです。javax.swing.Timer を使用するか、java.util.Timer を使用する必要がある場合はバックグラウンド スレッドで使用し、EDT でのみ Swing 呼び出しを行うようにしてください。これには SwingWorker が適しています。

于 2013-05-06T02:46:16.150 に答える