Avatar billede ducks Nybegynder
04. december 2010 - 17:15 Der er 3 kommentarer og
1 løsning

JEditorPane flimrer når opdateret fra timer, men ikke fra keyDown

Jeg er ved at lave en Java baseret chat og for at få farvekoder, links etc med har jeg valgt at  bruge JEditorPane + HTML. Problemet er bare, at jeg har sat en timer til at se om der er kommet noget nyt hvert 2. sekund, men når timeren kalder update metoden flimrer hele teksten, den anden metode der kalder update metoden er når man selv skriver en besked og trykker enter - her er der intet flimmer.

Jeg har prøvet hele dagen uden held, så nu håber jeg nogen kan forklare, hvad der går galt og hvad jeg kan gøre?

Jeg opdaterer med den her metode:

public void updateConversation()
{
    if (conversation.getLastUpdated() > lastUpdated)
    {
        txtLog.setText(conversation.toString());
       
        Document doc = txtLog.getDocument();
        try
        {
            doc.insertString(doc.getLength(), (""), null);
            txtLog.setCaretPosition(doc.getLength());
        }
        catch (BadLocationException e) {}
       
        lastUpdated = conversation.getLastUpdated();
    }
}

Det her er min timer

Timer timer = new Timer();
timer.schedule(
    new TimerTask()
    {
        @Override
        public void run() {
            updateConversation();
        }
    },
    0,
    2000
);

Den her opdaterer når man selv poster en ny besked (ingen flimmer her)

if (e.getKeyCode() == 10 && txtChat.getText().length() > 0)
{
    irc.sendMessage(txtChat.getText());
    conversation.saveMessage(irc.getUsername(), txtChat.getText(), irc.getHostname(), irc.getPrefix("#channel"));
    updateConversation();
    txtChat.setText("");
}
Avatar billede arne_v Ekspert
04. december 2010 - 19:32 #1
prøv og erstat:

updateConversation();

med:

EventQueue.invokeLater(new Runnable() {
    public void run() {
        updateConversation();
    }
});

kun et gæt, men du bør ikke opdatere GUI elementer fra andet end event tråden.
Avatar billede ducks Nybegynder
04. december 2010 - 20:58 #2
Tak så var du der igen med en løsning ;)

Skal jeg altid bruge EventQueue når jeg opdaterer et gui element?
Avatar billede arne_v Ekspert
04. december 2010 - 21:51 #3
Altid når du gør det fra en anden tråd end event tråden.

Diverse ActionListener og andet bliver kørt far event tråden og er derefor ikke et problem.

Men når man selv starter en tråd eller timer og opdaterer derfra, så skal man huske det.
Avatar billede arne_v Ekspert
04. december 2010 - 21:51 #4
Og hvis det virker så et svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester