Pergunta

Eu fiz um programa java GUI e ter adicionado uma JList em que GUI, de modo a imprimir a saída do programa em que jList adicionando um item chamando

listBox.addElement(""); // where listBox is an instance of jList

Mas o problema é que os itens não estão sendo exibidos no momento da adição. Eles estão sendo mostrados quando o programa está prestes a terminar.

Means, eu estou começando o programa clicando em um botão "Iniciar" e, em seguida, todo o processamento é feito incluindo a adição de itens à "listBox", mas os itens são mostrados na jList quando o programa retorna ao " actionPerformed ()" método do ActionListener do botão "Start".

O que pode ser feito de modo a mostrar os itens instantaneamente quando eles são adicionados à lista.

A aplicação acima é multithreaded. O lançamento segmento principal da GUI e, em seguida, começa a 10 threads e passar "ListModel" (instância de DefaultListModel) do jList a todos os tópicos de modo que cada segmento pode adicionar itens à lista, chamando o "método em "addElement ("") o "ListModel"

real, ListModel é um exemplo de uma subclasse (DefaultListModelSubClass) de classe DefaultListModel. Tenho substituir o método addElement () para torná-lo "sincronizado" para que de uma vez apenas um thread pode adicionar um item a isso.

Foi útil?

Solução

Você está provavelmente tentando fazer o processamento no Event Dispatching Thread, o thread que atualizações alças GUI. O seu processamento é trancar a GUI de atualização e, em seguida, quando o processamento acabamentos, as mudanças GUI apropriados propagar. Para chegar a este trabalho, você vai precisar para realizar o processamento em um segmento separado e se comunicar com o EVT conforme necessário. SwingWorker será a melhor maneira de fazer isso, se você tem o Java 6 disponíveis.

Outras dicas

Todos os repintura e processamento de eventos é feito no thread AWT Despacho do evento (EDT). Se isso não fosse o caso, então você faria por lidar com multithreading, e isso não é muito prático para uma GUI.

A solução é executar o processamento de bloqueio em outro segmento. Atualizar o GUI através da execução de código na EDT com java.awt.EventQueue.invokeLater. Como este é multithreaded você precisa ter muito cuidado. Em particular, o conselho comum é a preferir imutabilidade por objecto transferido entre roscas, de modo a evitar ter de bloqueio. Também usar alguns bloqueios de largura em detrimento de muitos pequenos, mas ainda ter cuidado com retornos de chamada.

Evite SwingWorker. Faz demos curto. No entanto, para o código de produção que obriga um projeto onde a GUI e não-GUI estão fortemente acoplados.

Este é o que acontece

click
   |
   -----> ActionPerformed
              |
              ---------------->  Fill the list 
                                        |    for each item 
                                        --------------------> jlist.addElement()
              |
              ----------------> paint the jlist

Indiretamente você está invocando o método de pintura quando o preenchimento das extremidades da lista.

Se você quiser ter resultados antes disso, você vai ter que pintar a lista como você adicionar elementos a ele.

Usando o SwingWorker como Stefan Kendall menciona lhe permitirá fazer isso.

Em termos gerais o que você faz é simultaneamente usando outro segmento para a lista de "preenchimento", que de vez em quando dizer a "pintura" thread para atualizar o gui

click
   |
   -----> ActionPerformed
              |
              ---------------->  Fill the list 
                                        |    for each item 
                                        --------------------> jlist.addElement()
                                             |
                                             | ( in other thread ) 
                                             ----> paint the list ( with the element so far ) 

              |
              ----------------> paint the jlist 

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top