初学JAVA,小小测试下JAVA JList控件的功能,貌似以前学C#时List类的控件可以改变指定单元格背景色,不知道JAVA里的JList是否同样可以?求高人指点?代码如下import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ListCellRenderer;/**
 * 测试改变指定单元格元素
 * @author 天册
 * 2011年12月8日
 */
public class TestLists extends JFrame implements ActionListener { Vector v = new Vector();
JList lst = new JList(v);
JButton btnTest = new JButton("测试"); public TestLists() {
setLocation(400, 300);
Container c = this.getContentPane();
c.add(new JScrollPane(lst), BorderLayout.CENTER);
c.add(btnTest, BorderLayout.SOUTH);
pack();
setVisible(true);
lstLaunch(); //lst中添加元素和指定单元格类型的方法
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
btnTest.addActionListener(this);   //通过按钮事件改变JList某个单元格
} private void lstLaunch() {
for (int i = 0; i < 10; i++) {
v.addElement(i);
}
lst.setCellRenderer(new MyRender());
} /**
 * @param args
 */
public static void main(String[] args) {
TestLists tl = new TestLists(); } @Override
public void actionPerformed(ActionEvent e) {
Object o = e.getSource();
if (o.equals(btnTest)) {
//跪求高人指点此处该怎么写才能改变指定单元格,比如第3个单元格背景色设置为红色

} } /**
 * Copy 自API文档,应该是设置单元格属性的东东
 * @author SUN
 */
private class MyRender extends JButton implements ListCellRenderer { public MyRender() {
this.setOpaque(true);
} @Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
setText(value.toString()); Color background;
Color foreground; // check if this cell represents the current DnD drop location
JList.DropLocation dropLocation = list.getDropLocation();
if (dropLocation != null && !dropLocation.isInsert()
&& dropLocation.getIndex() == index) { background = Color.BLUE;
foreground = Color.red; // check if this cell is selected
} else if (isSelected) {
background = Color.green;
foreground = Color.red; // unselected, and not the DnD drop location
} else {
background = Color.WHITE;
foreground = Color.BLACK;
}
; setBackground(background);
setForeground(foreground); return this; } }}

解决方案 »

  1.   

    个性化显示JList,需要重载ListCellRenderer,例如在getListCellRendererComponent方法内:
    if(index == 3) {
      // ...
    }然后在JList lst = new JList(v);后指定:
    lst.setCellRenderer(new MyRender());
      

  2.   


    可这样做只能静态的显示,无法通过事件源来动态驱动啊我感觉我似乎陷入了误区老大,如果我通过按钮点击事来驱动,请教下  为什么这样写毫无反应啊....
    @Override
    public void actionPerformed(ActionEvent e) {
    Object o = e.getSource();
    if (o.equals(btnTest)) {
    //跪求高人指点此处该怎么写才能改变指定单元格,比如第3个单元格背景色设置为红色
    lst.getCellRenderer().getListCellRendererComponent(lst, v.get(3), 3, false, true).setBackground(Color.red);
    } }
      

  3.   

    public Component getListCellRendererComponent(JList list, Object value,int index, boolean isSelected, boolean cellHasFocus) {
    if(value!=null) 
            { 
    str = value.toString();
                setText(str); 
                setBackground(isSelected   ?   Color.yellow:   Color.white); 
                setForeground(isSelected   ?   Color.red   :   Color.black); 
            } 
            return   this; 
    }
      

  4.   

    LZ,我说下你在2楼的问题。从你在2楼贴出的代码来看,你的思路是错误的。JAVA组件会分层次自动调用渲染组件的类中的方法,不需要你显式调用getListCellRendererComponent方法。用我在1楼贴出的方法能实现你的个性化显示的需求。自己写一个MyRender类,这个类你已经贴出来了,再根据自己的喜好修改下。然后在JList lst = new JList(v);后加一句:
    lst.setCellRenderer(new MyRender());
    就妥了。
      

  5.   


    晕,我就是不想让他自动的去弄,我想按照我的意愿去改变单元格其实我是在做一个类似于 跑跑卡丁车 游戏房间准备游戏 的课程设计不过我做的是一款不同阵营的网络对战游戏,我想用三个JList来区分不同阵营如果角色点击准备按钮,在JList中他的名字就变成绿色,如果未准备,他的名字是红色,卡了我好久其实我是在做一个游戏房间的网络游戏,就像泡泡卡丁车之类的,
      

  6.   


    虽然还是没有找到合适解决的方案,但非常感谢各位的热心回答,CSDN有段时间不知道什么情况,提问基本没人回答,于是就好久没看了,想不到现在又活跃起来了,感动丫。。
      

  7.   


    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Container;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Vector;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JList;
    import javax.swing.JScrollPane;
    import javax.swing.ListCellRenderer;/**
     * 测试改变指定单元格元素
     * @author 天册
     * 2011年12月8日
     */
    public class TestLists extends JFrame implements ActionListener {    Vector v = new Vector();
        JList lst = new JList(v);
        JButton btnTest = new JButton("测试");
        
        private int curIndex = -1;    public TestLists() {
            setLocation(400, 300);
            Container c = this.getContentPane();
            c.add(new JScrollPane(lst), BorderLayout.CENTER);
            c.add(btnTest, BorderLayout.SOUTH);
            pack();
            setVisible(true);
            lstLaunch();    //lst中添加元素和指定单元格类型的方法
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            btnTest.addActionListener(this);   //通过按钮事件改变JList某个单元格
        }    private void lstLaunch() {
            for (int i = 0; i < 10; i++) {
                v.addElement(i);
            }
            lst.setCellRenderer(new MyRender());
        }    /**
         * @param args
         */
        public static void main(String[] args) {
            TestLists tl = new TestLists();    }    @Override
        public void actionPerformed(ActionEvent e) {
            Object o = e.getSource();
            if (o.equals(btnTest)) {
                curIndex = 3; // 比如第3个单元格...
                lst.repaint();
            }    }    /**
         * Copy 自API文档,应该是设置单元格属性的东东
         * @author SUN
         */
        private class MyRender extends JButton implements ListCellRenderer {        public MyRender() {
                this.setOpaque(true);
            }        @Override
            public Component getListCellRendererComponent(JList list, Object value,
                    int index, boolean isSelected, boolean cellHasFocus) {
                setText(value.toString());            Color background = Color.WHITE;
                Color foreground = Color.BLACK;            if (index == curIndex) {
                    background = Color.red;
                    foreground = Color.white;                // check if this cell is selected
                } else if (isSelected) {
                    background = Color.green;
                    foreground = Color.red;
                }            setBackground(background);
                setForeground(foreground);            return this;        }    }}
      

  8.   

    膜拜中终于知道怎么搞了,太谢谢了用外部成员变量来控制,NND,脑子总是容易短路
      

  9.   

    崩溃,咋获得上一个元素的背景色呢?
    我要的效果是,右侧的Jlist中的元素,若是连续的(如2,3,4,5)那么他们就显示同一背景色,当出现与上面的元素不连续的元素时,其背景色与它上面的那一个元素背景色不同。只使用绿色和黄色2种背景色。我现在做的无法获得上面元素的背景色。附代码,请前辈指点import java.awt.Color;
    import java.awt.Component;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;import javax.swing.DefaultListModel;
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JLabel;
    import javax.swing.JList;
    import javax.swing.JScrollPane;
    import javax.swing.ListCellRenderer;
    import javax.swing.ListModel;
    import javax.swing.WindowConstants;/**
     *
     * @author  __USER__
     */
    public class MyDemo extends JDialog implements ActionListener { private JList jList1;
     private JButton jButton1;
     private JButton jButton2;
     private JList jList2;
     private DefaultListModel listModel1;
     private DefaultListModel listModel2;
     private JButton confirmBtn;
     private JScrollPane paneA;
     private JScrollPane paneB;  {
      //Set Look & Feel
      try {
       javax.swing.UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
      } catch(Exception e) {
       e.printStackTrace();
      }
     }
     /**
     * Auto-generated main method to display this JFrame
     */
     public static void main(String[] args) {
      MyDemo inst = new MyDemo();
      inst.setVisible(true);
     }
     
     public MyDemo() {
      super();
      initGUI();
     }
     
     private void initGUI() {
      try {
       setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
       paneA = new JScrollPane();
       paneB = new JScrollPane();
       getContentPane().setLayout(null);
       getContentPane().add(paneA);
       getContentPane().add(paneB);
       this.setTitle("光缆熔接");
       
       {
        listModel1 = new DefaultListModel();
        listModel1.addElement("1");
        listModel1.addElement("2");
        listModel1.addElement("3");
        listModel1.addElement("4");
        listModel1.addElement("5");
        listModel1.addElement("6");
        listModel1.addElement("7");
        listModel1.addElement("8");
        jList1 = new JList(listModel1);
        
        paneA.setBounds(30, 28, 130, 250);
        paneA.setViewportView(jList1);
       }
       {
        listModel2 = new DefaultListModel();
        jList2 = new JList(listModel2);
        
        jList2.setCellRenderer(new ColorRender());
        
        paneB.setBounds(330, 28, 130, 250);
        paneB.setViewportView(jList2);
        
       }
       {
        jButton1 = new JButton();
        getContentPane().add(jButton1);
        jButton1.setText("添加->>");;
        jButton1.setBounds(210, 80, 80, 28);
        jButton1.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
          jButton1ActionPerformed(evt);
         }
        });
       }
       {
        jButton2 = new JButton();
        getContentPane().add(jButton2);
        jButton2.setText("<<-移除");
        jButton2.setBounds(210, 170, 80, 28);
        jButton2.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
          jButton2ActionPerformed(evt);
         }
        });
       }
       {
       confirmBtn = new JButton("确定");
       getContentPane().add(confirmBtn);
       confirmBtn.setBounds(370, 300, 80, 28);
       confirmBtn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
    confirmBtnActionPerformed(evt);
    }
       });
       }
       pack();
       setSize(500, 380);
       setLocationRelativeTo(null);
      } catch (Exception e) {
       e.printStackTrace();
      }
     }
     /** jList1移动到jList2*/
     private void jButton1ActionPerformed(ActionEvent evt) {
       if(jList1.getSelectedIndex()!=-1) {
       
       //将光缆段A的纤芯批量加到光缆段B
       Object[] items = jList1.getSelectedValues();
       
       for (int i = 0; i < items.length; i++) {
       listModel2.addElement(items[i].toString());
       }
       
       int[] index = jList1.getSelectedIndices();
       for (int i = index.length -1 ; i >= 0 ; i--) {
       listModel1.remove(index[i]);
       }
       //将纤芯升序排列
     //获取listModel里的元素值
     List temp = new ArrayList();
     for (int i = 0; i<listModel2.size(); i++) {
    temp.add(listModel2.getElementAt(i));
     }
     //list排序
     Collections.sort(temp);
     //清空
     listModel2.clear();
     
     //重新为listModel赋上排序后的值
     for (Object item : temp) {
    listModel2.addElement(item);
    }
     jList2.repaint();
       }
     }  private void jButton2ActionPerformed(ActionEvent evt) {
     Object[] items = jList2.getSelectedValues();
     int[] index = jList2.getSelectedIndices();
     
     for (int i = 0 ;i < items.length; i++) {
     listModel1.addElement(items[i]);
     }
     for (int i = items.length - 1 ;i >= 0; i--) {
     listModel2.remove(index[i]);
     }
     

     //获取listModel里的元素值
     List temp = new ArrayList();
     for (int i = 0; i<listModel1.size(); i++) {
    temp.add(listModel1.getElementAt(i));
     }
     //list排序
     Collections.sort(temp);
     //清空
     listModel1.clear();
     //重新为listModel赋上排序后的值
     for (Object item : temp) {
    listModel1.addElement(item);
    }
     
    jList2.repaint(); 
     }
     
     private void confirmBtnActionPerformed(ActionEvent evt){
     
     } @Override
    public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub

    }
    }class ColorRender extends JButton implements ListCellRenderer{ @Override
    public Component getListCellRendererComponent(JList list, Object value,
    int index, boolean isSelected, boolean cellHasFocus) {
    this.setBorder(null);
    setText(value.toString());
    Color[] c = {Color.green,Color.yellow};
    ListModel model = list.getModel();
    int size = model.getSize();
    int i = 0;
    if(size > 0){
    if(index == 0){
    this.setBackground(Color.green);
    }else{
    int front = Integer.parseInt(model.getElementAt(index-1).toString());
    int temp = Integer.parseInt(model.getElementAt(index).toString());
    if(temp - front == 1){
    this.setBackground(c[i]);
    //background = Color.green;
    }else{
    i++;
    this.setBackground(c[i]);
    }
    }
    }
    if(isSelected){
    this.setBackground(Color.red);
    //background = Color.red;
    }
    //setBackground(background);
    return this;
    }
    }