solo il mouse cliccato caso di aggiornamento JLabel proprietà text JLabel correttamente

StackOverflow https://stackoverflow.com/questions/1686188

  •  18-09-2019
  •  | 
  •  

Domanda

sto usando un filo java per aggiornare valore di testo JLabel nella mia applicazione ma dopo l'aggiornamento del testo sulla JLabel JLabel che mostra tutti i valori passati aggiornato e nuovo valore periodicamente per via rinfrescante stessa

ma quando uso stessa funzione di aggiornamento all'interno dell'evento mouseclick di JLabel esso si sta aggiornando una piacevole sorpresa e mostrando solo ultimo valore

che cosa può causare questo problema mi manca alcuni metodi che chiama internamente evento click del mouse?

Nore: applicazione è JApplet

È stato utile?

Soluzione

È necessario garantire che le modifiche a Swing componenti dell'interfaccia utente vengono eseguite sul thread evento Dispatch. Qui ci sono due suggerimenti per realizzare questo:

Timer

Si consiglia di controllare le javax.swing .Timer se l'obiettivo è quello di aggiornare periodicamente il testo JLabel. I timer incendi ActionEvents periodicamente sul filo evento Invio:

  int delay = 1000; //milliseconds
  ActionListener taskPerformer = new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
          label.setText("foo");
      }
  };
  new Timer(delay, taskPerformer).start();

SwingWorker

In alternativa si consiglia di utilizzare un SwingWorker per eseguire l'elaborazione in background. Il thread in background lavoratore può comunicare informazioni al filo Evento spedizione chiamando publish.

new SwingWorker<Void, String>() {
  // Called by the background thread.
  public Void doInBackground() {
    for (int i=0; i<100; ++i) {
      // Do work.  Periodically publish String data.
      publish("Job Number: " + i);
    }
  }

  // Called on the Event Dispatch Thread.
  @Override
  protected void process(List<String> chunks) {
    // Update label text.  May only want to set label to last
    // value in chunks (as process can potentially be called
    // with multiple String values at once).
    for (String text : chunks) {
      label.setText(text);
    }
  }  
}.execute();

Altri suggerimenti

Non so esattamente che cosa sta succedendo, ma vorrei iniziare da rendere sicuro il vostro aggiornamento avviene nel thread evento spedizione. Avere la chiamata filo di aggiornamento:

SwingUtilities.invokeLater(new Runnable() {
  public void run() {
    // ...update the text...
  }
});

Vedere la Evento spedizione Discussione tutorial.

perché non do u provare questo: labelname .paintImmediately ( labelname .getVisibleRect ());

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top