三大控件之————JList


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));
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值