第17章 列表

17章 列表

  由JList类代表的Swing列表显示一个可选取对象列表,它支持三种选取模式:单选取、单间隔选取和多间隔选取。
  JList类把维护和绘制列表的工作委托给一个对象来完成。一个列表的模型维护一个对象列表,列表单元绘制器将这些对象绘制在列表单元中。
  缺省情况下,列表单元绘制器是DefaultListCellRenderrer的实例,它绘制表17-1中列出的对象。图标和字符串按原样显示,而所有其他类型对象的绘制方式是:通过显示从这些对象的toString返回的字符串来绘制这些对象。

17-1 一个简单的列表样例


import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;

public class Test extends JApplet {
public void init() {
Container contentPane = getContentPane();
Object[] items = { "item one", "item two", "item three",
"item four", "item five", "item six",
"item seven", "item eight",
"item nine", "item ten" };

JList list = new JList(items);
JScrollPane sp = new JScrollPane(list);

list.setVisibleRowCount(7);

contentPane.setLayout(new FlowLayout());
contentPane.add(sp);
}
}


17.1 列表模型

 

17-2 一个带有缺省列表模型的列表


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class Test extends JApplet {
private JList list = new JList();

String[] items = { "item[0]", "item[1]", "item[2]",
"item[3]", "item[4]", "item[5]",
"item[6]", "item[7]",
"item[8]", "item[9]" };

public void init() {
Container contentPane = getContentPane();
JPanel controlPanel = new ControlPanel(list);

contentPane.add(controlPanel, BorderLayout.NORTH);
contentPane.add(new JScrollPane(list),
BorderLayout.CENTER);
populateList();
}
public void populateList() {
DefaultListModel model = new DefaultListModel();

for(int i=0; i < items.length; ++i)
model.addElement(items[i]);

list.setModel(model);
}
}
class ControlPanel extends JPanel {
JButton remove = new JButton("remove selected items");
JButton add = new JButton("add item");

public ControlPanel(final JList list) {
add(remove);
add(add);

remove.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int[] selected = list.getSelectedIndices();
DefaultListModel model =
(DefaultListModel)list.getModel();

for(int i=0; i < selected.length; ++i) {
model.removeElementAt(selected[i] - i);
}
}
});
add.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
final DefaultListModel model =
(DefaultListModel)list.getModel();

String s = JOptionPane.showInputDialog(
list,
"Enter item text:");

model.addElement(s);

SwingUtilities.invokeLater(new Runnable() {
public void run() {
list.ensureIndexIsVisible(
model.getSize()-1);
}
});
}
});
}
}


17.1.1 AbstractListModel

 

17.1.2 DefaultListModel

 

17.2 列表选取

 

17.3 列表单绘制器

 

17-3 实现一个定制列表单元绘制器


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

public class Test extends JApplet {
private String[] names = new String[] {
"baseball player", "basketball player",
"beach player", "chef",
"hockey player", "software developer",
"construction worker", "martial artist",
"soccer", "movie star"
};
private String[] pics = new String[] {
"baseball.gif", "basketball.gif",
"beach_umbrella.gif", "dining.gif",
"hockey.gif", "mad_hacker.gif",
"men_at_work.gif", "punch.gif",
"soccer.gif", "filmstrip.gif"
};

public void init() {
Container contentPane = getContentPane();
ListModel model =
new NameAndPictureListModel(names, pics);

ListCellRenderer renderer =
new NameAndPictureListCellRenderer();

JList list = new JList(model);

list.setCellRenderer(renderer);
list.setVisibleRowCount(5);

contentPane.setLayout(new FlowLayout());
contentPane.add(new JScrollPane(list));
}
}
class NameAndPictureListModel extends DefaultListModel {
public NameAndPictureListModel(String[] names,String[] pics) {
for(int i=0; i < names.length; ++i) {
addElement(new Object[] {
names[i], new ImageIcon(pics[i]) } );
}
}
public String getName(Object object) {
Object[] array = (Object[])object;
return (String)array[0];
}
public Icon getIcon(Object object) {
Object[] array = (Object[])object;
return (Icon)array[1];
}
}
class NameAndPictureListCellRenderer extends JLabel
implements ListCellRenderer {
private Border
lineBorder = BorderFactory.createLineBorder(Color.red, 2),
emptyBorder = BorderFactory.createEmptyBorder(2,2,2,2);

public NameAndPictureListCellRenderer() {
setOpaque(true);
}
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
NameAndPictureListModel model =
(NameAndPictureListModel)list.getModel();

setText(model.getName(value));
setIcon(model.getIcon(value));

if(isSelected) {
setForeground(list.getSelectionForeground());
setBackground(list.getSelectionBackground());
}
else {
setForeground(list.getForeground());
setBackground(list.getBackground());
}

if(cellHasFocus) setBorder(lineBorder);
else setBorder(emptyBorder);

return this;
}
}


17.3.1 JList属性

 

17.3.2 JList事件

 

17-4 检测列表选取的调整值


import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;

public class Test extends JApplet {
public void init() {
Container contentPane = getContentPane();

String[] items = { "item[0]", "item[1]", "item[2]",
"item[3]", "item[4]", "item[5]",
"item[6]", "item[7]",
"item[8]", "item[9]" };

JList list = new JList(items);

contentPane.add(new JScrollPane(list),
BorderLayout.CENTER);

list.addListSelectionListener(
new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
String s;

if(e.getValueIsAdjusting()) {
s = "adjusting selection ...";
}
else {
s = "selection from " + e.getFirstIndex() +
" to " + e.getLastIndex();
}
showStatus(s);
}
});
}
}


17-5 处理列表选取事件


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class Test extends JApplet {
private ControlPanel controlPanel;

public void init() {
Container contentPane = getContentPane();
JPanel listPanel = new JPanel();

String[] items = { "item[0]", "item[1]", "item[2]",
"item[3]", "item[4]", "item[5]",
"item[6]", "item[7]",
"item[8]", "item[9]" };

JList list = new JList(items);

list.setPrototypeCellValue("MMMMMMM");

controlPanel = new ControlPanel(list);
controlPanel.update();

listPanel.setBorder(BorderFactory.createEtchedBorder());
listPanel.add(new JScrollPane(list));

contentPane.add(controlPanel, BorderLayout.NORTH);
contentPane.add(listPanel, BorderLayout.CENTER);

list.addListSelectionListener(
new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
controlPanel.update();
}
});
}
}
class ControlPanel extends JPanel {
private JComboBox mode = new JComboBox();
private JButton clear = new JButton("clear selection");

private String single = "SINGLE_SELECTION",
singleInterval = "SINGLE_INTERVAL_SELECTION",
multipleInterval = "MULTIPLE_INTERVAL_SELECTION";

private JLabel leadLabel = new JLabel(),
anchorLabel = new JLabel(),
minLabel = new JLabel(),
maxLabel = new JLabel(),
selIndicesLabel = new JLabel();

private JList list;

public ControlPanel(JList l) {
JPanel top = new JPanel(),
mid = new JPanel(),
bottom = new JPanel();

this.list = l;

setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
setBorder(BorderFactory.createEtchedBorder());

top.add(mode);
top.add(clear);

mid.add(new JLabel("Lead:")); mid.add(leadLabel);
mid.add(new JLabel("Anchor:")); mid.add(anchorLabel);
mid.add(new JLabel("Minimum:")); mid.add(minLabel);
mid.add(new JLabel("Maximum:")); mid.add(maxLabel);

add(top);
add(mid);
add(bottom);

mode.addItem(single);
mode.addItem(singleInterval);
mode.addItem(multipleInterval);
initializeSelectionMode();

bottom.add(new JLabel("Selected Indices:"));
bottom.add(selIndicesLabel);

mode.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange() == ItemEvent.SELECTED)
setSelectionMode((String)e.getItem());
}
});
clear.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
list.clearSelection();
}
});
}
public void update() {
int lead = list.getLeadSelectionIndex(),
min = list.getMinSelectionIndex(),
max = list.getMaxSelectionIndex(),
anchor = list.getAnchorSelectionIndex();

leadLabel.setText(Integer.toString(lead) + " / ");
anchorLabel.setText(Integer.toString(anchor) + " / ");
minLabel.setText(Integer.toString(min) + " / ");
maxLabel.setText(Integer.toString(max) + " / ");

int[] selected = list.getSelectedIndices();
String s = new String();

for(int i = 0; i < selected.length; ++i) {
s += Integer.toString(selected[i]);

if(i < selected.length-1)
s += ",";
}
selIndicesLabel.setText(s);
validate();
}
private void initializeSelectionMode() {
int m = list.getSelectionMode();

switch(m) {
case ListSelectionModel.SINGLE_SELECTION:
mode.setSelectedItem(single);
break;
case ListSelectionModel.SINGLE_INTERVAL_SELECTION:
mode.setSelectedItem(singleInterval);
break;
case ListSelectionModel.MULTIPLE_INTERVAL_SELECTION:
mode.setSelectedItem(multipleInterval);
break;
}
}
private void setSelectionMode(String s) {
if(s.equals("SINGLE_SELECTION")) {
list.setSelectionMode(
ListSelectionModel.SINGLE_SELECTION);
}
else if(s.equals("SINGLE_INTERVAL_SELECTION")) {
list.setSelectionMode(
ListSelectionModel.SINGLE_INTERVAL_SELECTION);
}
else if(s.equals("MULTIPLE_INTERVAL_SELECTION")) {
list.setSelectionMode(
ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
}
}
}


17-6 处理列表数据事件


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class Test extends JApplet {
private JList list = new JList();

private String[] items = {
"item one", "item two", "item three",
"item four", "item five", "item six",
"item seven", "item eight",
"item nine", "item ten"
};

public void init() {
Container contentPane = getContentPane();

JPanel controlPanel = new ControlPanel(this, list);

contentPane.add(controlPanel, BorderLayout.NORTH);
contentPane.add(new JScrollPane(list),
BorderLayout.CENTER);
populateList();
}
public void populateList() {
final DefaultListModel model = new DefaultListModel();

for(int i=0; i < items.length; ++i)
model.addElement(items[i]);

list.setModel(model);

if(list.isShowing())
list.revalidate();

model.addListDataListener(new ListDataListener() {
public void contentsChanged(ListDataEvent e) {
showStatus("contents changed");
}
public void intervalRemoved(ListDataEvent e) {
Object[] message = new Object[] {
"Removed item at index " + e.getIndex0(),
" ",
"There are now " + model.getSize() + " items"
};
JOptionPane.showMessageDialog(Test.this,
message,
"Items Removed", // title
JOptionPane.INFORMATION_MESSAGE); // type
}
public void intervalAdded(ListDataEvent e) {
showStatus("interval added");
}
});
}
}
class ControlPanel extends JPanel {
JButton remove = new JButton("remove selected items");
JButton repopulate = new JButton("repopulate");

public ControlPanel(final Test applet, final JList list) {
add(remove);
add(repopulate);

remove.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int[] selected = list.getSelectedIndices();
DefaultListModel model =
(DefaultListModel)list.getModel();

for(int i=0; i < selected.length; ++i) {
model.removeElementAt(selected[i] - i);
}
}
});
repopulate.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
applet.populateList();
}
});
}
}


 

 

17-7 处理鼠标双击和三击


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class Test extends JApplet {
public void init() {
Container contentPane = getContentPane();

String[] items = { "item one", "item two", "item three",
"item four", "item five", "item six",
"item seven", "item eight",
"item nine", "item ten" };

JList list = new JList(items);

contentPane.setLayout(new FlowLayout());
contentPane.add(new JScrollPane(list));

list.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
JList theList = (JList)e.getSource();
ListModel model = theList.getModel();

int index = theList.locationToIndex(e.getPoint());
String itemString =
(String)model.getElementAt(index);

String s = new String(" for " +
model.getElementAt(index));

switch(e.getClickCount()) {
case 1:
showStatus("Single Click" + s);
break;
case 2:
showStatus("Double Click" + s);
break;
case 3:
showStatus("Triple Click" + s);
break;
}
}
});
}
}


17.3.3 JList类总结

 

17.3.4 AWT兼容

 

17.4 本章回顾

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python编程快速上手是一本非常适合初学者的编程入门教材,本书总共分为16,内容涵盖了Python的基础语法、常用数据结构、函数与模块、文件操作、异常处理等主题。这本书采用了简明扼要的语言和清晰的示例,使读者能够迅速掌握Python编程的基础知识。 首先,书中的第一介绍了Python的基础知识,包括Python的起源和特点,如何安装Python以及如何使用Python解释器。接着,第二讲解了Python的基本语法,包括变量、运算符、条件语句、循环语句等,这些是编程的基础,读者可以很快掌握。 然后,书中的第三讲解了Python的数据结构,包括列表、元组、字典、集合等,这些数据结构在Python编程中非常重要。接下来,第四介绍了Python的函数与模块,包括如何定义函数、如何使用内置函数以及如何导入和使用模块。 书中的第五和第六讲解了文件的操作和异常处理,这些是编程中常用的技巧。此外,还有第七介绍了正则表达式,第八和第九介绍了网络编程和多线程编程,第十介绍了数据库的操作,第十一介绍了图形界面编程,第十二介绍了Web开发,第十三介绍了数据分析和机器学习,第十四介绍了游戏开发,第十五介绍了图像和声音处理,最后一介绍了如何发布和分发自己的Python程序。 总之,Python编程快速上手这本书内容丰富全面,适合想要快速学习Python编程的初学者,通过阅读这本书,读者可以迅速掌握Python编程的基础知识,并能够在实际项目中灵活运用。同时,书中的示例丰富实用,对于加深编程理解和提升实践能力也非常有帮助。推荐给那些想要快速上手Python编程的读者。 ### 回答2: 《Python编程快速上手PDF》是一本适合初学者入门的Python编程书籍。Python作为一种简单易学的编程语言,被广泛应用于数据分析、Web开发、人工智能等领域。这本书的目的是帮助读者快速掌握Python的基本语法和常用库,从而能够快速编写简单的程序。 《Python编程快速上手PDF》首先介绍了Python的基本语法,包括变量、数据类型、运算符、控制流等内容。通过具体的示例代码,读者可以学习如何定义变量、执行基本运算以及使用条件语句和循环语句来控制程序流程。 接下来,本书引入了Python的常用库,如NumPy、Pandas、Matplotlib等。这些库提供了丰富的功能和工具,可以方便地进行数据分析、处理和可视化。通过学习这些库的用法,读者可以掌握如何使用Python进行数据处理和分析的基本方法。 此外,本书还介绍了如何使用Python进行Web开发、爬虫等应用。通过学习Django、Flask等Web框架的基本使用方法,读者可以了解如何搭建一个简单的Web应用。同时,本书还介绍了使用Python进行爬虫的基本原理和方法,读者可以学习如何爬取网页内容并进行数据提取和分析。 总之,《Python编程快速上手PDF》是一本帮助读者快速入门Python编程的实用书籍。通过学习本书的内容,读者可以快速掌握Python的基本语法和常用库的使用方法,从而能够使用Python编写简单的程序和进行一些基本的数据处理和分析。无论是初学者还是有一定编程基础的读者,都可以通过阅读本书快速掌握Python编程。 ### 回答3: 《Python编程快速上手.pdf》是一本针对初学者编写的Python编程入门书籍。本书主要以实际项目为例,介绍了Python编程的基础知识和常用技巧。 首先,本书从Python的基本概念开始介绍,如变量、数据类型、运算符等。然后,逐渐引入Python的控制结构,如条件语句、循环语句等,并配以简单易懂的示例代码,帮助读者理解和掌握这些概念。 接着,本书讲解了Python的函数、模块和文件操作等重要内容。通过学习函数的定义和调用,读者可以学会如何编写可重用的代码;通过了解模块的概念和引入,读者可以利用Python强大的标准库和第三方库进行更高级的功能实现;通过学习文件的读取和写入操作,读者可以处理各种文件格式并进行数据处理。 此外,本书还介绍了Python面向对象编程的基础知识,如类、对象、继承等。通过学习面向对象编程的思想,读者可以更好地组织和管理代码,并在实际项目中更好地实现功能。 最后,本书还涵盖了Python的一些高级主题,如异常处理、多线程、网络编程等。这些知识点将帮助读者更好地编写稳定、高效的Python程序。 总结来说,通过《Python编程快速上手.pdf》这本书,读者可以快速入门Python编程,并具备一定的编程能力。无论是对于初学者还是有一定编程经验的人来说,都是一本不可多得的编程学习资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值