JPopupMenu是對于Swing開發者是在熟悉不過的組件了,不過大部分人只將其作為右擊彈出菜單使用,其實JPopupMenu還可以有很多用途,可以說只要是需要彈出式效果的都可以用其實現。例如我們用開發工具輸入import java.util.當輸入“.”時會自動彈出提示框選項,以下的小程序展示了這樣的效果:
1
import java.awt.BorderLayout;
2
import java.awt.Color;
3
import java.awt.Dimension;
4
import java.awt.Point;
5
import java.awt.event.KeyAdapter;
6
import java.awt.event.KeyEvent;
7
8
import javax.swing.JComponent;
9
import javax.swing.JFrame;
10
import javax.swing.JLabel;
11
import javax.swing.JList;
12
import javax.swing.JPopupMenu;
13
import javax.swing.JScrollPane;
14
import javax.swing.JTextArea;
15
import javax.swing.SwingConstants;
16
import javax.swing.SwingUtilities;
17
18
import twaver.TWaverUtil;
19
20
public class PopupTipDemo extends JFrame {
21
22
String[] messages = new String[] {
23
"getTWaverJava()",
24
"getTWaverWeb()",
25
"getTWaverFlex()",
26
"getTWaverDotNET()",
27
"getTWaverGIS()",
28
"getTWaverHTML5()",
29
"getTWaverJavaFX()",
30
"getTWaver
", };
31
32
JLabel label = new JLabel("TWaver makes everything easy!");
33
JList list = new JList(messages);
34
JComponent tip = new JScrollPane(list);
35
JTextArea text = new JTextArea();
36
JPopupMenu popup = new JPopupMenu();
37
38
public PopupTipDemo() {
39
super("www.servasoftware.com");
40
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
41
this.getContentPane().setLayout(new BorderLayout());
42
this.getContentPane().add(new JScrollPane(text), BorderLayout.CENTER);
43
this.tip.setPreferredSize(new Dimension(230, 80));
44
this.label.setForeground(Color.BLUE);
45
this.label.setHorizontalAlignment(SwingConstants.CENTER);
46
this.popup.setLayout(new BorderLayout());
47
this.popup.add(label, BorderLayout.NORTH);
48
this.popup.add(tip, BorderLayout.CENTER);
49
50
this.text.setText("// Try to press '.'\nimport twaver.Node;\nimport twaver.Link;\nimport twaver.network");
51
this.text.setBackground(Color.WHITE);
52
this.text.setForeground(Color.BLUE);
53
this.text.setCaretColor(Color.RED);
54
55
this.text.addKeyListener(new KeyAdapter() {
56
public void keyReleased(KeyEvent e) {
57
if (popup.isShowing()) {
58
popup.setVisible(false);
59
} else if (e.getKeyCode() == KeyEvent.VK_PERIOD) {
60
Point point = text.getCaret().getMagicCaretPosition();
61
if (point != null) {
62
popup.show(text, point.x, point.y);
63
}
64
text.requestFocus();
65
}
66
}
67
});
68
}
69
70
public static void main(String[] args) {
71
SwingUtilities.invokeLater(new Runnable() {
72
public void run() {
73
PopupTipDemo demo = new PopupTipDemo();
74
demo.setSize(400, 200);
75
TWaverUtil.centerWindow(demo);
76
demo.setVisible(true);
77
}
78
});
79
}
80
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30


31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

其實TWaver Java的Demo中的QuickSearch欄就有這么個下拉功能,twaver.swing.TDropDownSelector組件,這個封裝得非常好,以下寥寥幾行demo.DemoUtil中的代碼就實現了下拉效果,大家只要專注在自己下拉的內容即可
1
// create drop down selector
2
final TDropDownSelector selector = new TDropDownSelector(txtSearch, new JScrollPane(list)){
3
public Dimension getSelectorSize(){
4
int width = this.getSize().width;
5
if(width < 200){
6
width = 200;
7
}
8
return new Dimension(width, 320);
9
}
10
};

2

3

4

5

6

7

8

9

10
