import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import javax.swing.*;
public class MyList extends JFrame {
private String[] st1= {"你好","阿斯","发给","服务"};
private JList list;
DefaultListModel model = new DefaultListModel();
MouseHandle mh = new MouseHandle();
public MyList(){
init();
mylist();
}
private void init() {
setSize(300, 400);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
private void mylist(){
for(int i = 0; i < st1.length;i++){
model.addElement(st1[i]); //通过改变模型的值去改变列表的值(动态的自动更新)
} //以后操作数据主要就是操作模型的值
list = new JList(model);
list.addMouseListener(mh);
add(list);
}
public static void main(String[] args) {
new MyList().setVisible(true);
}
}
//***************************************************************************
class MouseHandle extends MouseAdapter{ //可以响应列表点击两次的事件
@Override
public void mouseClicked(MouseEvent e) {
if(e.getClickCount()==2){
System.out.println(e.getSource().toString());
}
}
}
注:下面这个方法可以设置JList上弹出菜单,非常实用的技术(pop为PopupMenu)
Object o =e.getSource();
Point p = e.getPoint();
if(o instanceof JList){
JList myList = (JList) o;
int index = myList.locationToIndex(p);
if(index == 2){
pop.show(list, list.getWidth(), e.getY()); //设置弹出菜单显示的位置
}
}
//***************************************************************************
class MyListCellRenderer extends JButton implements ListCellRenderer { //渲染器继承JButton 可以绘制列表的显示风格
private static boolean isSelect=false; //也可以继承JLabel
private String name;
private BufferedImage user = ImageUtil.getImage("user.png"); //此处采用类加载图片
private BufferedImage progress_select_background = ImageUtil.getImage("progress_select_background.png");
private BufferedImage progress_unselect_background = ImageUtil.getImage("progress_unselect_background.png");
private BufferedImage chart = ImageUtil.getImage("chart.png");
private BufferedImage submodule = ImageUtil.getImage("submodule.png");
private Graphics pen1;
private Graphics pen2;
private BufferedImage img;
@Override //渲染器要实现的方法
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
this.setText(value.toString());
this.setPreferredSize(new Dimension(SizeUtil.width,30)); //设置大小
name=value.toString(); //将列表的值传给变量name,用来在下面重新画出
switch(index%3){ //根据余数不同设置要画的图片
case 0:
img=submodule;
break;
case 1:
img=chart;
break;
case 2:
img=user;
}
if(isSelected){
isSelect=true;
}
else{
isSelect=false;
}
return this;
}
public void paint( Graphics g){ //绘制列表项显示风格,为JButton或JLabel
BufferedImage buffer_user = new BufferedImage(SizeUtil.width, 30, BufferedImage.TYPE_INT_ARGB);
BufferedImage buffer_background = new BufferedImage(SizeUtil.width, 30, BufferedImage.TYPE_INT_ARGB);
pen2=buffer_background.getGraphics(); //创建空的缓冲画笔
pen2.setFont(new Font("宋体",Font.BOLD,14));
pen2.setColor(Color.WHITE);
pen1=buffer_user.getGraphics();
pen1.setFont(new Font("宋体",Font.BOLD,14));
pen1.setColor(Color.GRAY);
if(isSelect){
pen2.drawImage(progress_select_background,0,0,SizeUtil.width,30,null); //用图片在缓冲区画图
pen2.drawImage(img,15,7,img.getWidth(),img.getHeight(),null);
pen2.drawString(name, 70, 18); //画需要显示的字
g.drawImage(buffer_background, 0,0,SizeUtil.width,30,null); //画在桌面上
}else{
pen1.drawImage(progress_unselect_background,0,0,1000,30,null);
pen1.drawImage(img,15,7,img.getWidth(),img.getHeight(),null);
pen1.drawString(name, 70, 18);
g.drawImage(buffer_user, 0,0,SizeUtil.width,30,null);
}
}
}
//***************************************************************************
public class ImageUtil { //这个类采用了类加载资源的方式,资源要放在相应的包下
public static BufferedImage getImage(String url){
InputStream in = ImageUtil.class.getResourceAsStream("img\\"+url); //类加载
BufferedImage buffer = null;
try {
buffer = ImageIO.read(in); //读取相应的资源
} catch (IOException e) {
e.printStackTrace();
}
return buffer;
}
//创建、返回TexturePaint
public static TexturePaint getPaintByUrl(String url){
BufferedImage buffer = getImage(url);
int width = buffer.getWidth();
int height = buffer.getHeight();
return new TexturePaint(buffer, new Rectangle(width, height));
}
}