初学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; } }}
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; } }}
if(index == 3) {
// ...
}然后在JList lst = new JList(v);后指定:
lst.setCellRenderer(new MyRender());
可这样做只能静态的显示,无法通过事件源来动态驱动啊我感觉我似乎陷入了误区老大,如果我通过按钮点击事来驱动,请教下 为什么这样写毫无反应啊....
@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);
} }
if(value!=null)
{
str = value.toString();
setText(str);
setBackground(isSelected ? Color.yellow: Color.white);
setForeground(isSelected ? Color.red : Color.black);
}
return this;
}
lst.setCellRenderer(new MyRender());
就妥了。
晕,我就是不想让他自动的去弄,我想按照我的意愿去改变单元格其实我是在做一个类似于 跑跑卡丁车 游戏房间准备游戏 的课程设计不过我做的是一款不同阵营的网络对战游戏,我想用三个JList来区分不同阵营如果角色点击准备按钮,在JList中他的名字就变成绿色,如果未准备,他的名字是红色,卡了我好久其实我是在做一个游戏房间的网络游戏,就像泡泡卡丁车之类的,
虽然还是没有找到合适解决的方案,但非常感谢各位的热心回答,CSDN有段时间不知道什么情况,提问基本没人回答,于是就好久没看了,想不到现在又活跃起来了,感动丫。。
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; } }}
我要的效果是,右侧的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;
}
}