Como mostrar itens em uma JList no java?
-
06-07-2019 - |
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.
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