用JList显示好友,并通过删除和添加DefaultListModel中的内容将在线好友置顶。发现两个问题。第一是Swing更新UI界面时的线程同步问题,后来通过一个帖子解决了(重写invoklater方法)。但是还有一个问题,就是在每次更新好友列表以后,选中项会发生变化(就是颜色的变化问题),比方说,当有两个个好友在线的时候,我选中第一个,然后待下次更新以后,发现置顶的两个在线好友都变成了选中状态;如果我选中第二个在线好友,那么下次更新以后,选中状态会消失。请问各位大侠,这个应该怎么解决?现在我有一个解决办法,就是说取消在线置顶的功能,还有其他方法吗?代码如下:
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.SwingUtilities;public class TestJList { JFrame jf = new JFrame();
DefaultListModel lm = new DefaultListModel();
JList jl = new JList(lm);
public TestJList(){
jf.setVisible(true);
jf.setBounds(300, 300, 300, 300);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.add(jl);
lm.add(0, "a");//添加好友a
lm.add(1, "b");//添加好友b
lm.add(2, "c");//添加好友c
final String[] s= new String[]{"a","b"};//a、b是在线好友
new Thread(){
public void run(){
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
for (int i = 0; i < s.length; i++) {
for (int j = 0; j < lm.size(); j++) {
if (s[i].equals(lm.get(j))) {
lm.add(0,s[i]);//删除和添加defaultlistmodel,实现在线好友置顶
lm.remove(j+1);
break;
}

}
}

}
});
}
}
}.start();
        }




public static void main(String[] args){


TestJList wt = new TestJList();
  }
}

解决方案 »

  1.   

    做一个排序如果在线 返回1 不在线返回-1然后list进行排序,这样在线的就在前面了。你一展示,他就置顶了
      

  2.   

    我明白我的问题在哪了,是算法问题:我先选中a;然后线程休眠一秒,然后,第一步:先在顶部添加a,然后两个a一起变色,然后删除a,这样a看上去还是保持选中状态(所以只有a在线的时候,没问题);然后第二步,我先在顶部添加b,于是a和出现在顶部的b一起变色,这时有两个b存在,我删除第二个b,就出现了顶部两个选项都呈现选中状态的情况。
    如果我在插入和删除b的时候,将b的插入位置定位在a下面,b上面,就不会出现变色的情况了。
    看来JList的绘制是这样:如果一个元素呈现选中状态,在此元素上方添加新元素,那么新插入的元素同刚才选中的元素一起呈现选中状态。
      

  3.   

    也可以给个上线标示啊,上线的为0,不上线的为1,还有其他的,然后order by一下就行了
      

  4.   

    最终解决办法出来了,用了个冒泡排序方法。代码如下:
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;import javax.swing.DefaultListModel;
    import javax.swing.JFrame;
    import javax.swing.JList;
    import javax.swing.SwingUtilities;public class TestJList { JFrame jf = new JFrame();
    DefaultListModel lm = new DefaultListModel();
    JList jl = new JList(lm);
    public TestJList(){
    jf.setVisible(true);
    jf.setBounds(300, 300, 300, 300);
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.add(jl);
    lm.add(0, "a");//添加好友a
    lm.add(1, "b");//添加好友b
    lm.add(2, "c");//添加好友c
        final String[] s= new String[]{"b"};//a、b是在线好友

    new Thread(){
    public void run(){
    while (true) {
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }


    //冒泡排序,向后添加(或者用set方法)
    for (int i = lm.getSize(); i > 0 ; i--) {
    for (int j = 0; j < i-1 ; j++) {
    sort(lm, s, j);
    }
    }
    }}
    }.start();
            }




    public static void main(String[] args){


    TestJList wt = new TestJList();
      }
    //以下是相邻的两个元素的排序方法
    public static void sort(DefaultListModel lm,String[] s,int j) {
    for (int i = 0; i <= s.length; i++) {
    if (i == s.length) {
    for (int k = 0; k < s.length; k++) {
    if (s[k].equals(lm.get(j+1).toString())) {
    // lm.add(j+2, lm.get(j));//这两行是向后添加方法,好处是选中项提前的时候,依旧保持选中状态。
    // lm.removeElementAt(j); //
    lm.set(j+1, lm.set(j,lm.get(j+1)));//这行是替换法,好处是变换顺序的时候,选中项扔出刚才的位置(只是位置不变);而且不会引发Swing绘制UI的线程冲突异常
    break;
    }
    }
    } else {
    if (s[i].equals(lm.get(j).toString())) {
    break;
    } }
    }
    }
    }