[code]listChat = new javax.swing.JList();[/code]
[code]listChat.setModel(new DefaultListModel());
scrollChat.setViewportView(listChat);[/code]
[code]public void alguemFalou(String quem, String fala) {
System.out.println("ALGUEM FALOU!");
DefaultListModel l = (DefaultListModel) listChat.getModel();
l.addElement(quem + ": " + fala);
listChat.updateUI();
}
[/code]
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:
[code]
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)
[/code]
depois..
volta ao normal..
e depois mais falas e falas
e acontece..
etc..
alguem pode dar um HHHEEELLLPPP :P
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 
Use JList.repaint() em vez de JList.updateUI().
Na verdade, remova completamente aquela linha. Ela é inútil.
O model já se encarrega de avisar a lista que ela deve ser repintada.
deu certo 
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
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();
}
Pode repetir as dúvidas agora em português, e com coerência?
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());
Resolvido.
A classe Rule, do exemplo, tem um atributo isMetric.
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í.
Por que você não insere no model direto? E para que você precisa dessa thread?
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 =/