`
zeyuphoenix
  • 浏览: 55682 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JList列表框

 
阅读更多
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="ProgId" content="Word.Document"> <meta name="Generator" content="Microsoft Word 12"> <meta name="Originator" content="Microsoft Word 12"> <link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cphoenix%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"> <link rel="Edit-Time-Data" href="file:///C:%5CDOCUME%7E1%5Cphoenix%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_editdata.mso"> <!--[if !mso]> <style> v":* {behavior:url(#default#VML);} o":* {behavior:url(#default#VML);} w":* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} </style> <![endif]--><link rel="themeData" href="file:///C:%5CDOCUME%7E1%5Cphoenix%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"> <link rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5Cphoenix%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"> <!--[if gte mso 9]><xml> Normal 0 false 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE </xml><![endif]--><!--[if gte mso 9]><![endif]--><style> <!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4;} @font-face {font-family:Calibri; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-alt:"Times New Roman";} @font-face {font-family:""@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal { mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; font-family:"Calibri","serif"; mso-bidi-font-family:"Times New Roman";} .MsoChpDefault { mso-bidi-font-family:"Times New Roman";} /* Page Definitions */ @page {} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; layout-grid:15.6pt;} div.Section1 {page:Section1;} --> </style> <!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable { mso-style-parent:""; font-size:10.5pt; font-family:"Calibri","serif";} </style> <![endif]-->

JListJCombobox组件从本质上说是类似的,它们都是提供了一系列列表数据供用户选择,从表现形式上可以把JCombobox看做一个JList和一个JTextField组成,通过callback机制回调选择项目.JList并没有复杂的UI,当然也就没有复杂的画面了,所以对于提高JList的画面表现,一般继承ListCellRenderer加入自己的表现样式就可以了,当然依照SwingMVC原则,需要修改数据时,实现ListModel接口就可以了,对选择样式修改,实现ListSelectionModel接口就可以了,它们的实现都相对简单,功能也相对简单,一般都不需要实现,对于复杂画面样式也不推荐JList,单列的JTable和自己实现的JTree比它好很多.

JList的基本使用很简单,先看Sun官方的使用例子:

界面如下:

<!--[if gte vml 1]> <![endif]-->

只需要新创建一个DefaultListModel,赋予需要显示的值就可以了.

    DefaultListModel listModel = new DefaultListModel();

    listModel.addElement("Debbie Scott");

    listModel.addElement("Scott Hommel");

    listModel.addElement("Sharon Zakhour");

然后创建JList

JList list = new JList(listModel);

list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

当然可以给它加监听:

list.addListSelectionListener(this);

也可以加鼠标的Click监听,这是所有JComponent都具有的能力.

然后实现监听就可以了:

    // This method is required by ListSelectionListener.

    publicvoid valueChanged(ListSelectionEvent e) {

       if (e.getValueIsAdjusting() == false) {

最后把创建JList放入画面上,就完成了.

Sun官方还给了一个使用JList的例子,在同一行显示多个项目:

界面如下:

<!--[if gte vml 1]> <![endif]-->

创建JList的过程和前一个例子相同,只是需要继承JList把它的getScrollableUnitIncrement方法重写,变成我们自己的表现样式:

   /**

     * Returns the distance to scroll to expose the next or previous

     * row (for vertical scrolling) or column (for horizontal scrolling).

     */

    @Override

publicint getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {

这个方法就是描绘JList前一个后一个行或者列的表现的,只需要根据容器的大小算出现在每个格子的大小:

 Rectangle r = getCellBounds(row, row);

然后依次放置就可以了,布局使用FlowLayout.

      Point loc = r.getLocation();

      loc.y--;

      int prevIndex = locationToIndex(loc);

      Rectangle prevR = getCellBounds(prevIndex, prevIndex);

      if (prevR == null || prevR.y >= r.y) {

            return 0;

      }

      return prevR.height;

当然也可以重写其它的类实现其它样式,复杂样式也可以重写JListListUI.

其它的JList的设置颜色,字体,背景等都很简单,按照API就可以了,至于拖拽操作也和其它组件一样.

最后我们实现一个自己的JList,在它的单元格内加入图片,复选框,设置它是否可以选择,图片是否可以显示,当然你也可以加入其它的表现形式,只需要再写入新的接口.

界面如下:




<!--[if gte vml 1]> <![endif]--><!--[if gte vml 1]> <![endif]--><!--[if gte vml 1]> <![endif]-->

当单元格是选中状态时,点击Print按钮输入选中的项目:

<!--[if gte vml 1]> <![endif]-->

工程目录如下:

<!--[if gte vml 1]> <![endif]-->

先看几个接口,

/**

 * the interface that the JComboBox can Icon enable.

*/

publicinterface IconEnable {

/**

 * the interface that the list can have icon.

*/

publicinterface IconItem {

/**

 * the interface that the JComboBox can select enable.

*/

publicinterface SelectEnable {

/**

 * the interface that the list can have select.

*/

publicinterface SelectItem {

它们都提供

    /**

     * set bean.

     */

    publicvoid setXXX(XXX XXX);

    /**

     * get bean.

     */

    public XXX getXXX();

来表示JList某项自定义属性.

然后自定义一个类实现这些接口:

/**

 * list item.

*/

publicclass MyListItem implements IconItem, IconEnable, SelectEnable,

       SelectItem {

它的属性:

    /**

     * list value.

     */

    private Object listItem = null;

    /**

     * list is select.

     */

    privatebooleanisSelected = false;

    /**

     * list icon.

     */

    private Icon icon = null;

    /**

     * list icon enable.

     */

    privatebooleanisIconEnable = true;

    /**

     * list is select enable.

     */

    privatebooleanisSelectEnable = true;

这样就使这个类可以保存JList的单元格的项,我们的JListModel使用这个类的实例作为Bean来存储JList的信息.

接着是一个JList项目的显示描绘类,

/**

 * the list cell's label.

*/

publicclass MyListLabel extends JLabel {

它复写JLabel

    @Override

    publicvoid setBackground(Color color) {

    @Override

    publicvoid paint(Graphics g) {

    @Override

    public Dimension getPreferredSize() {

调整JList的单元格的颜色,图片样式,字体,焦点偏移和最适合大小.

g.setColor(UIManager.getColor("Tree.textBackground"));

g.drawRect(imageOffset, 0, d.width - 1 - imageOffset,

                         d.height - 1);

最后就是重要的画面表现类MyListRenderer,它需要实现ListCellRenderer接口

/**

 * JList cell renderer.

*/

publicclass MyListRenderer extends JPanel implements MouseListener,

       ListCellRenderer {

通过继承JPanel,使JList的单元格可以实现任何的控件效果,这里是放置一个JCheckBox和我们自定义的MyListLabel:

    /**

     * JList cell renderer.

     */

    public MyListRenderer(JList list) {

       this.list = list;

       setLayout(null);

       add(checkBox = new JCheckBox());

       add(label = new MyListLabel());

    checkBox.setBackground(UIManager.getColor("Tree.textBackground"));

    label.setForeground(UIManager.getColor("Tree.textForeground"));

       commonIcon = UIManager.getIcon("Tree.leafIcon");

    }

实现接口的getListCellRendererComponent方法,返回我们需要的呈现:

    /**

     * Return a component that has been configured to display the specified

     * value.

     */

    @Override

    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {

其中value就是我们的自定义单元格MyListItem,可以设置属性:

设置可用: setEnabled(((SelectEnable) value).isSelectEnabled());

设置选择: checkBox.setSelected(((SelectItem) value).getSelect());

设置Label的选择: label.setSelected(isSelected);

设置字体和图片:

label.setFont(list.getFont());

       label.setText(value.toString());

       label.setFocus(cellHasFocus);

       if (((IconEnable) value).isIconEnabled()) {

           Icon icon = ((IconItem) value).getIcon();

           if (icon == null) {

              icon = commonIcon;

           }

           label.setIcon(icon);

       }

同样也通过重写getPreferredSizesetBackgrounddoLayout设置合适大小、颜色和布局:

Dimension d_check = checkBox.getPreferredSize();

       Dimension d_label = label.getPreferredSize();

       returnnew Dimension(d_check.width + d_label.width,

              (d_check.height < d_label.height ? d_label.height

                     : d_check.height));

通过两个组件的合适大小可以得出两个组件的位置:

y_check = (d_label.height - d_check.height) / 2;

然后通过设定位置,做出Layout:

label.setLocation(d_check.width, y_label);

label.setBounds(d_check.width, y_label, d_label.width, d_label.height);

最后处理的是JList的鼠标选择JCheckBox事件,

    @Override

    publicvoid mouseClicked(MouseEvent e) {

通过选择定位选择的Item,然后对应设置选中状态,刷新:

    int index = list.locationToIndex(e.getPoint());

    MyListItem item = (MyListItem) list.getModel().getElementAt(index);

    if (((SelectEnable) item).isSelectEnabled()) {

       item.setSelect(!((SelectItem) item).getSelect());

       Rectangle rect = list.getCellBounds(index, index);

       ist.repaint(rect);

    }

这个我们的JList就设置完了,它的使用和普通的一样,只不过Model使用的是MyListItem数组:

    MyListItem[] items = { new MyListItem("Astart"),

           new MyListItem("B-BIX", true, icon),

           new MyListItem("have fun game!", false, null, false, false),

           new MyListItem("郁闷", false),

           new MyListItem("abc", true),

           new MyListItem("12867831", false, icon),

           new MyListItem("happy", false, null, false, true),

           new MyListItem("defINE", false, null) };

JList jList = new JList(items);

设置Renderer:

jList.setCellRenderer(new MyListRenderer(jList));

然后得到的JList就和普通JComponent一样使用了.

分享到:
评论

相关推荐

    Java Swing JList列表框的实现

    主要介绍了Java Swing JList列表框的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    JList列表框 中盛放 CheckBox复选框,并可以实现上下移动,和鼠标拖动移动

    在JList列表框 中盛放 CheckBox复选框,并可以实现列表中的项上下移动和鼠标拖动列表项进行移动,可以直接运行

    基于JAVA的列表框JList

    基于JAVA的列表框JList

    java列表框应用

    java列表框应用,讲了比较详细的JList用法,分享出来,希望有用处。

    Java Swing程序设计

    Java Swing程序设计 JCheckBox复选框组件 JComboBox选择框窗组件 JList列表框组件 JTextArea文本域组件 窗体的显示位置及大小(图) 全部的综合应用之二:计算器的实现 等等等等

    JList多选值的获取

    JList多选值的获取, 由JList组件实现的列表框有3种选取模式,设置方法为通过JList类的setSelectionMode(int selectionMode)方法,该方法的入口参数可以通过ListSelectionModel类中的静态常量设置。

    编程技能训练与等级考试辅导:综合应用.pptx

    JList列表框基本方法 JComboBox组合框的基本属性、方法 ;? JMenuBar、JMenu、JMenuItem菜单组件的基本属性、方法(难点) ? Font类、Color类、ImageIcon类基本方法(难点) ActionKevent事件、KeyEvent事件、Mouse...

    可重新排序的列表框:创建一个列表框,其内容可以通过单击和拖动项目进行重新排序。-matlab开发

    创建的列表框是标准的 Matlab UICONTROL('Style','Listbox'),其底层 Java JList 修改了以下属性:'DragEnabled'、'DragSelectionEnabled'、'DropMode'、'DropTarget'、'MousePressedCallback' 和 ' ...

    Java学习指南(Swing入门篇)

    本篇内容至少包含:- 基本控件的使用- 布局管理器的使用- 自定义布局- 图片的加载及使用- 对话框,及自定义对话框- 菜单和工具栏- 自定义绘图- JList 列表框的用法,以及单元格的自定义显示- JTable 表格的用法,...

    Java图形用户界面之列表框

    列表框通过Swing组件JList产生,其总是在屏幕上占据固定行数的空间。这篇文章主要介绍了java图形用户界面之列表框的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下

    一个java应用程序

    本例是一个java应用程序,使用JList实现列表框

    用列表模型构建列表实例

    这个例子介绍如何用一个列表模式来构建列表框,这样可以让JList更有灵活性和实用性。

    Java Swing中的JButton、JComboBox、JList和JColorChooser组件使用案例

    主要介绍了Java Swing中的按钮(JButton)、组合框(JComboBox)、下拉列表(JList)和颜色选择器(JColorChooser)组件使用案例,需要的朋友可以参考下

    Swing组件下载(常用组件)

    列表:JList 文本字段:JTextField 文本区域:JTextArea 滚动条:JScrollBar 滑块:JSlider 进度栏:JProgressBar 格式化字段:JFormattedTextField 口令字段:JPasswordField Spinner:JSpinner 分隔符:JSeparator...

    java实现别踩白块儿源码-JavaCode:我专门介绍以下主题:Java基本数据类型,声明语句,表达式语句,导入类库,用户输入之外,检查有效

    Swing及其组件的图形用户界面(GUI),GUI事件处理,ChangeListener,JOptionPane,组合框,列表框,JLists,DefaultListModel,将JScrollpane与JList,JSpinner,JTree,Flow,Border,和框布局管理器。 使用Java ...

    JAVA实验通讯录-实验报告.pdf

    构造了 JFrame mainFrm 为主窗口, JTextField name 为姓名输入框, JTextField tel 为电话输入框, JTextField add 为地址输入框, JList dataList 为列表组建, String[] ming 为姓名数组, String[] phone 为...

    javaSE代码实例

    14.5.6 将数组转换为列表 285 14.6 集合 286 14.6.1 Set接口及含义 286 14.6.2 HashSet类的使用 287 14.6.3 equals与hashCode方法重写规定的作用 288 14.6.4 LinkedHashSet类的使用 291 14.6.5 ...

    Java开发详解.zip

    031812_【第18章:图形界面】_列表框:JList笔记.pdf 031812_【第18章:图形界面】_下拉列表框:JComboBox笔记.pdf 031813_【第18章:图形界面】_菜单组件笔记.pdf 031814_【第18章:图形界面】_文件选择框笔记.pdf ...

    JIDE Grids (表格)开发员技术手册

    它涵盖不只是JTable,还包括JList和JTree。您务必运行我们提供的演示程序才能体会到我们在该产品上花了多少精力,所有这些都是为了让您能更容易地进一步开发。 功能介绍 界面组件 PropertyGrid - 属性表格,一...

    疯狂JAVA讲义

    第1章 Java概述 1 1.1 Java语言的发展简史 2 1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 ...学生提问:当我们使用编译C程序时,不仅需要指定存放...

Global site tag (gtag.js) - Google Analytics