이 질문을 여러 번 전에 알고 있습니다. 그러나 JList를 업데이트하는 방법을 연구하는 데 몇 시간을 보냈습니다.이 문제로 처리 할 수 없었습니다. 나는 누가 온라인 또는 오프라인인지를 보여주는 JList를 구현하려고 시도하고있다. (이것은 JLabels를 보유하고 있는데, 이것은 아이콘이있는 문자열을 유지하는 유일한 방법이다). 나는 내 자신의 CellRenderer()
을 가지고있다.DefaultListModel()을 사용하여 요소를 추가하거나 제거하는 동안 JList를 업데이트하는 방법
public class UserRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value,int index, boolean isSelected, boolean hasFocus) {
if(value instanceof ClientObject){
final ClientObject clientObject = (ClientObject) value;
JLabel label = (JLabel) super.getListCellRendererComponent(list, clientObject.getNickName(), index, isSelected, hasFocus);
if(clientObject.isIsOnline()){
label.setIcon(iconArray[1]);
}
else{
label.setIcon(iconArray[0]);
}
return label;
}
else {
return super.getListCellRendererComponent(list, value, index, isSelected, hasFocus);
}
}
}
또한이 방법으로 서버에 연결할 때마다 클라이언트의 목록을 구성합니다.
private void buildBuddyList(ClientObject tempClientObject){
if(tempClientObject.getBuddyList().size() > 0){
mainClient.setBuddyList(tempClientObject.getBuddyList());
for (Iterator<ClientObject> iter = mainClient.getBuddyList().iterator(); iter.hasNext();) {
ClientObject tempon = iter.next();
if(tempon.isIsOnline()){
model.addElement(tempon);
labelIconList.put(tempon, iconArray[1]);
}
else{
model.addElement(tempon);
labelIconList.put(tempon, iconArray[0]);
}
}
}
}
클라이언트 (온라인/오프라인이됩니다) 내가 model.clear()
모든 요소를 제거하고 다시 목록을 구축하기 시작 얻을 것입니다 그/그녀의 상태를 변경할 때 내가 사용하는 트릭. 다음은 코드 세그먼트입니다.
if(tempClientObject.isStatusChanged()){
if(tempClientObject.isIsConnected()){
System.out.println(tempClientObject.getUserName() + " is ONLINE");
model.clear();
for (Iterator<Map.Entry<ClientObject,ImageIcon>> iter = labelIconList.entrySet().iterator(); iter.hasNext();) {
Map.Entry<ClientObject,ImageIcon> pairs = iter.next();
ClientObject changedOnlineStatusClient = (ClientObject) pairs.getKey();
if(changedOnlineStatusClient.getUserName().equals(tempClientObject.getUserName())){
changedOnlineStatusClient.setIsOnline(tempClientObject.isIsOnline());
}
model.addElement(changedOnlineStatusClient);
}
}
else{
System.out.println(tempClientObject.getUserName() + " is OFFLINE");
model.clear();
for (Iterator<Map.Entry<ClientObject,ImageIcon>> iter = labelIconList.entrySet().iterator(); iter.hasNext();) {
Map.Entry<ClientObject,ImageIcon> pairs = iter.next();
ClientObject changedOnlineStatusClient = (ClientObject) pairs.getKey();
if(changedOnlineStatusClient.getUserName().equalsIgnoreCase(tempClientObject.getUserName())){
changedOnlineStatusClient.setIsOnline(tempClientObject.isIsOnline());
}
model.addElement(changedOnlineStatusClient);
}
}
}
그 논리적 시스템이 잘 작동 드릴 수 있습니다. (그들은 배경에서 제대로 작동하는지 내가 작업을 확인할 수 있습니다). 모델에 요소를 추가하더라도 서버 JList에 연결된 클라이언트가 비어있는 경우에만 문제가 발생합니다. 나는 모든 대답을 주셔서 감사하겠습니다. 덕분 어쨌든
[이벤트 발송 스레드] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)에서'ListModel '이 변경되는지 확인하십시오. – trashgod