Posted on 2012-05-30 09:55
TWaver 閱讀(1400)
評論(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
