Problemas atualizando JList

11 respostas
Fernando_H_Gomes
private javax.swing.JList listChat;
listChat = new javax.swing.JList();
listChat.setModel(new DefaultListModel());
        scrollChat.setViewportView(listChat);
public void alguemFalou(String quem, String fala) {
		System.out.println("ALGUEM FALOU!");
		DefaultListModel l = (DefaultListModel) listChat.getModel();
		l.addElement(quem + ": " + fala);
		listChat.updateUI();
	}

até ai tudo lindo.
esté é o codigo que exibi as falas no meu chat...

cada fala adciono um element no listModel..

mas depois de varias falas..

a tela do JList fica em branco.. e ao tentar enviar uma msg novamente..
nao tem relação da tela em branco com o erro..
pq se eu esperar um tempinho para enviar a fala.. nao da o erro
o erro ocorre quando eu vou enviando repetidamente ...

PS: String fala e String quem nunca estao nulos.. ja testei por debug.

ocorre:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at javax.swing.plaf.basic.BasicListUI.updateLayoutState(Unknown Source)
	at javax.swing.plaf.basic.BasicListUI.maybeUpdateLayoutState(Unknown Source)
	at javax.swing.plaf.basic.BasicListUI.getPreferredSize(Unknown Source)
	at javax.swing.JComponent.getPreferredSize(Unknown Source)
	at javax.swing.ScrollPaneLayout.layoutContainer(Unknown Source)
	at java.awt.Container.layout(Unknown Source)
	at java.awt.Container.doLayout(Unknown Source)
	at java.awt.Container.validateTree(Unknown Source)
	at java.awt.Container.validate(Unknown Source)
	at javax.swing.RepaintManager.validateInvalidComponents(Unknown Source)
	at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

depois..
volta ao normal..
e depois mais falas e falas
e acontece..
etc..

alguem pode dar um HHHEEELLLPPP :P

11 Respostas

R

Use JList.repaint() em vez de JList.updateUI().

ViniGodoy

Na verdade, remova completamente aquela linha. Ela é inútil.

O model já se encarrega de avisar a lista que ela deve ser repintada.

Fernando_H_Gomes

vlws vo tentar dai posto :slight_smile:

Fernando_H_Gomes

deu certo :slight_smile:

agora precisava de outra ajuda no JList
quando vai aparecendo as falas…
if um checkBox meu tiver selecionado…
que seria o “autoRolagem”…

o scroll desce… ate vizualizar a mensagem de baixo…

sabe…
igual chat…
autoRolagem :P:P

dei uma olhada nesse link http://java.sun.com/docs/books/tutorial/uiswing/components/scrollpane.html
mas n entendi mta coisa nao…

tbm queria saber desse método…

olhei ali no mesmo link…
ele coloca um "Rule"
como row header;;
uma regua…
blz …

queria saber qual component ja existente seria colocar o numero das linha…

1 -> Quem : Fala
2 -> Quem : Fala

Fernando_H_Gomes

o autoScroll eu ja resolvi…

linha 6.

public void alguemFalou(String quem, String fala) { System.out.println("ALGUEM FALOU! > " + quem +":" +fala); DefaultListModel l = (DefaultListModel) listChat.getModel(); l.addElement(quem + ": " + fala); if(chbRolagem.isSelected()) listChat.ensureIndexIsVisible(l.lastIndexOf(l.lastElement())); // scrollChat.setRowHeaderView(); }

ViniGodoy

Pode repetir as dúvidas agora em português, e com coerência?

Fernando_H_Gomes

o_O

Agora so estou precisando modificar o rowHeaderView
da minha JList.

Na documentação link que eu me referi, mostra um exemplo inserindo como rowHeaderView uma regua. Mostrando os centrimetros.

eu preciso mostrar apenas o numero de cada fala do meu chat.
a cada linha do JList
ele vai mostar no rowHeaderView o numero correspondente.

Qual conponente seria isto ?
no lugar de setRowHeaderView(new Rule());

Fernando_H_Gomes

Resolvido.
A classe Rule, do exemplo, tem um atributo isMetric.

emersonmx

estou revivendo o topico pois estou passando por algo parecido.

é o seguinte, eu crie um botão que adiciona a uma arraylist algum lixo, daí fiz uma classe qualquer que a cada segundo verifica se houve alguma alteração na arraylist e adiciona os aplica os valores dela numa jlist se necessario. o prob é que as vezes apaga tudo! e só volta a aparecer quando adiciona algo novo(ou não).

tá aqui a código(gambiarra) que eu fiz como exemplo

package jlistteste;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultListModel;

public class lixo extends javax.swing.JFrame {

	public lixo() {
		initComponents();
		Qualquer ref = new Qualquer();
		(new Thread(ref)).start();
	}

	@SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        nameList = new javax.swing.JList();
        addButton = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jScrollPane1.setViewportView(nameList);

        addButton.setText("Adicionar");
        addButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                addButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(addButton)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 250, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 245, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(addButton)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

	private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {
		listaDeAlgumaCoisa.add("Lixo");
		System.out.println("Tam: " + listaDeAlgumaCoisa.size());
	}

	public static void main(String args[]) {
		java.awt.EventQueue.invokeLater(new Runnable() {

			public void run() {
				new lixo().setVisible(true);
			}
		});
	}

	private class Qualquer implements Runnable {

		DefaultListModel modelo = new DefaultListModel();
		private List<String> lista = null;
		boolean atualiza = false;
		int tam = 0;

		public void run() {
			while (true) {
				lista = listaDeAlgumaCoisa;
				tam = lista.size();
				if (modelo.size() == tam) {
					for (int i = 0; i < tam; i++) {
						if (lista.get(i).compareTo((String) modelo.get(i)) != 0) {
							atualiza = true;
							break;
						}
					}
				} else {
					atualiza = true;
				}

				if (atualiza) {
					modelo.clear();

					for (int i = 0; i < tam; i++) {
						modelo.addElement(lista.get(i));
					}

					nameList.setModel(modelo);

					atualiza = false;
				}
				try {
					Thread.sleep(1000);
				} catch (InterruptedException ex) {
					Logger.getLogger(lixo.class.getName()).log(Level.SEVERE, null, ex);
				}
			}
		}
	}
	private List<String> listaDeAlgumaCoisa = new ArrayList<String>();
    // Variables declaration - do not modify
    private javax.swing.JButton addButton;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JList nameList;
    // End of variables declaration
}

eu só quero atualizar a lista apenas quando necessario como: quando adicionar algum valor ou mudar o nome de algum elemento e por ai vai…
e se tiver um modo melhor de fazer(com certeza tem) me diga o que posso fazer pra arrumar isso aí.

ViniGodoy

Por que você não insere no model direto? E para que você precisa dessa thread?

emersonmx

o codigo que eu postei realmente não precisa, é que eu fiz um servidor que gerencia os clientes que estão conectados, daí fiz uma lista pra mostrar os clientes que estão online =/

Criado 17 de junho de 2009
Ultima resposta 13 de jan. de 2010
Respostas 11
Participantes 4