科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道制作更酷的JList界面 .doc

制作更酷的JList界面 .doc

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

制作更酷的JList界面 .doc

作者: kl40127 来源:赛迪网技术社区 2007年11月29日

关键字: 界面 JList

  • 评论
  • 分享微博
  • 分享邮件
内容:1。绘制器的工作原理。2。用自订的绘制器更换JList和JComboBox的外观。3。让新的外观响应鼠标事件。借助swing体系的mvc设计理念,为组件更换不同的外观成为轻而易举的事情。本文主要以JList和JComboBox为例讲解ListCellRenderer的原理与用法.一、绘制器的工作原理不管是JList还是JComboBox,它们都用到了ListCellRenderer,因为JComboBox本身就是由一个下拉式的JList和TextField组成的. 在这里,它们使用了callback的机制。callback的一是种常见的方式是在A类中调用B类中的方法,在A类中先要登记一个(也可以是多个)B类的实例引用,在需要调用时再通过该实例来调用它的内部方法.这样的机制在很多的设计模式中都有用到,如Observer等.还有AWT的事件机制也用到了callback. 要实现callback,通常将B类设计成一个能被callback的接口.在JList的绘制器中,swing提供了一个ListCellRenderer接口,public interface ListCellRenderer {   Component getListCellRendererComponent(     JList list,     Object value,     int index,     boolean isSelected,     boolean cellHasFocus);}这个接口只提供一个方法,我们只要实现了这个接口,并将它的实例引用传给JList,就可以将JList替换成不同的样式了.看一下ListCellRenderer是如何工作的, 在绘制JList的每个Cell之前,它会去调用getListCellComponent( ),得到一个Component,并将这个Component绘制在正确的位置.因为getListCellComponent( )返回的是Component,所以我们几乎可以扩展任意一个Component,来改变JList,JComboBox等的外观.二、制作自已的绘制器我们现在要想让JList中显示一组学生名单,同时每个名单前显示该学生的图标.如下图所示 我们先来想一想,Swing中有什么组件既可以显示图标也可以显示文字? JLabel.对了。我们就用JLabel作为JList的绘制器, 看看我扩展的JLabel类,它实现了ListCellRenderer接口:     /* 可以显示图标的ListCell绘制器 */     public class IconListItemRenderer extends JLabel implements ListCellRenderer     {         private Border           selectedBorder = BorderFactory.createLineBorder(Color.blue,1),           emptyBorder = BorderFactory.createEmptyBorder(1,1,1,1);         public Component getListCellRendererComponent(                 JList list,                 Object value,                 int index,                 boolean isSelected,                 boolean cellHasFocus)           {           IconListItem item = (IconListItem)value;           this.setIcon(item.getIcon());           this.setText(item.getText());           if ( isSelected ) setBorder (selectedBorder);           else setBorder(emptyBorder);           return this;         }     }大家看到,getListCellRendererComponent方法会传入几个参数,我们就用它传入的几个参数设置JLabel的外观:图标与文字。在这个类中,我们用一个IconListItem接收调用者传过来的value,     IconListItem item = (IconListItem) value;IconListItem是我另外定义好的一个类,它用来存放每一个List Item的值,     import javax.swing.*;     public class IconListItem     {         Icon icon;         String text;         public IconListItem(Icon icon, String text)         {           this.icon = icon;           this.text = text;         }         public Icon getIcon() { return icon;}         public String getText() { return text;}         public void setIcon(Icon icon){ this.icon = icon;}         public void setText(String text){ this.text = text; }     }这样的话,我就可以用getIcon()和getText()方法取得每个List Item的值了,     IconListItem item = (IconListItem) value;     this.setIcon(item.getIcon());     this.setText(item.getText());至此,我们就可以用以下方法方便的更换JList的外观了,     JList list = new JList();     list.setCellRenderer(new IconListItemRenderer()); file://安装我们自订的cellRenderer     DefaultListModel listModel = new DefaultListModel();     list.setModel(listModel);     IconListItem item = new IconListItem(new ImageIcon(...),"John");     listModel.addElement(item);   // 为List增加Item     ...由于JComboBox也有一个下拉式清单,所以它的清单也是用ListCellRenderer来绘制的,所以我们也可以将这个IconListItemRenderer给它用:     JComboBox list = new JComboBox();     list.setRenderer(new IconListItemRenderer()); //装我们自订的cellRenderer     DefaultComboBoxModel comboModel = new DefaultComboBoxModel();     list.setModel(comboModel);     IconListItem item = new IconListItem(new ImageIcon(...),"John");     comboModel.addElement(item);   // 为List增加Item     ...注意,JComboBox安装绘制器时是用setRenderer()方法,JList是用setCellRenderer()方法,名字稍有不同.
查看本文来源
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章