Posted on 2012-05-30 09:55
TWaver 阅读(1399)
评论(1) 编辑 收藏
大家知道TWaver Java总的TList继承自Swing的JList,所以我们可以很容易控制其选择,例如单选、多选等。但是本文介绍如何控制按指定数量进行选择。
人生就是一个不停选择的过程。所以,我们必须要谨慎地控制好你的选择,无论是TList的SelectionModel,还是人生之路。
在实际项目中,我们经常需要对list进行不能超过限定数量的多重选择控制。本文用到的技巧可能是本站最简单的一次了:利用DataBox的SelectionModel,当选择总数超过限定,就将最早的选择删除。
1 box.getSelectionModel().addDataBoxSelectionListener(new DataBoxSelectionListener() {
2 @Override
3 public void selectionChanged(DataBoxSelectionEvent e) {
4 if (e.getBoxSelectionModel().size() > max)
5 e.getBoxSelectionModel().firstElement().setSelected(false);
6 }
7 }
8 });
其中max我们可以指定。如果max=1则变成了单选。
通过这个思路,本文写了一个很简单的例子:通过控制多选数量,制作一个简单的点菜选择。相信你的系统中也经常会有类似的场景:通过list让用户选择指定数量的数据。
1package bb.app.leather;
2
3 import java.awt.*;
4 import java.awt.event.*;
5 import java.util.*;
6
7 import javax.swing.*;
8
9 import twaver.*;
10 import twaver.list.*;
11
12 public class TestFrame extends JFrame {
13 public TestFrame() {
14 this.setTitle("TWaver点菜器");
15 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
16 this.setSize(700, 350);
17 TWaverUtil.centerWindow(this);
18 JPanel optionPane = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 120));
19 final JComboBox cbMax = new JComboBox();
20 for (int i = 1; i < 6; i++) {
21 cbMax.addItem(i);
22 }
23 optionPane.add(new JLabel("最多可以点"));
24 optionPane.add(cbMax);
25 optionPane.add(new JLabel("个菜。 "));
26 optionPane.add(new JLabel("您点的菜:"));
27 final JLabel lbOptions = new JLabel(" ");
28 optionPane.add(lbOptions);
29 JButton btnOption = new JButton("点菜");
30 optionPane.add(btnOption);
31 btnOption.addActionListener(new ActionListener() {
32 @Override
33 public void actionPerformed(ActionEvent arg0) {
34 ArrayList<String> options = pickOption((Integer) cbMax.getSelectedItem());
35 String text = "";
36 for (String option : options) {
37 text += option + " ";
38 }
39 lbOptions.setText(text);
40 }
41 });
42 this.getContentPane().add(optionPane, BorderLayout.CENTER);
43 }
44
45 private ArrayList<String> pickOption(final int max) {
46 String[] options = {
47 "回锅肉",
48 "宫保鸡丁",
49 "京酱肉丝",
50 "红烧鸡杂",
51 "红烧大肠",
52 "青椒炒蛋",
53 "西红柿炒蛋",
54 };
55
56 TDataBox box = new TDataBox();
57 for (String option : options) {
58 ResizableNode node = new ResizableNode();
59 node.setName(option);
60 box.addElement(node);
61 }
62 box.getSelectionModel().addDataBoxSelectionListener(new DataBoxSelectionListener() {
63 @Override
64 public void selectionChanged(DataBoxSelectionEvent e) {
65 if (e.getBoxSelectionModel().size() > max) {
66 e.getBoxSelectionModel().firstElement().setSelected(false);
67 }
68 }
69 });
70 TList list = new TList(box);
71 list.setTListSelectionMode(TList.CHECK_SELECTION);
72 list.setIconVisible(false);
73 JScrollPane scroll = new JScrollPane(list);
74 Object[] message = new Object[] { "您要吃点什么?注意:最多只能点" + max + "个菜哦!", scroll };
75 int answer = JOptionPane.showConfirmDialog(this, message, "点菜", JOptionPane.OK_CANCEL_OPTION);
76 ArrayList<String> result = new ArrayList<String>();
77 if (answer == JOptionPane.OK_OPTION) {
78 Iterator it = box.getSelectionModel().selection();
79 while (it.hasNext()) {
80 result.add(((Element) it.next()).getName());
81 }
82 }
83 return result;
84 }
85
86 public static void main(String[] args) throws Exception {
87 UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
88 TestFrame ui = new TestFrame();
89 ui.setVisible(true);
90 }
91 }
92