崩溃,咋获得上一个元素的背景色呢?
我要的效果是,右侧的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;
}
}

解决方案 »

  1.   

    。。贴上代码运行一下就可以啦最下的那个类是重写的cellRender
    自己顶一下
      

  2.   

    学了Java没有两天,但觉得你的问题有点怪:
    无法获取上面元素的颜色,不知道该如何给当前元素赋值背景色
    我的想法是,没有必要去获取上面元素的颜色,为什么去取它呢?
    假设你要使用N种颜色,保存在数组中,默认使用索引为0的颜色,当序号中断时,索引加1,使用对应的颜色不就可以了吗?(索引>=数组长度时归0)
      

  3.   

    不要在Renderer中设置,
    在程序中设置
      

  4.   

    解决了哎,不懂内部运行机制,真可悲class ColorRender extends JButton implements ListCellRenderer{

    Color up = Color.green;
    @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(up); //这行很关键,如果设置了固定值,就会出问题,不知道为什么
    }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]);
    this.setBackground(up);
    }else{
    if(up == Color.yellow){
    this.setBackground(Color.green);
    up = Color.green;
    }else{
    this.setBackground(Color.yellow);
    up = Color.yellow;
    }


    }
    }
    }
    if(isSelected){
    this.setBackground(Color.red);
    }
    //setBackground(background);
    return this;
    }
    }