單類為了啥:保證實例唯一;提供全局函數;減少內存消耗;…. 也許還有很多很多用途,不過在Applet的使用中一定要避免UI組件單類的設計模式:
1、主要原因是如果Applet被重新加載,也就是點擊瀏覽器的刷新按鈕,或者在同一個瀏覽器下關閉Applet再打開的情況下,新的Applet將以新的Swing toolkit threads對鍵盤事件進行處理,這樣以前緩存的單UI實例組件將再也接收不到鍵盤事件。http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4339842
2、當然還有另外一個問題就是Swing的組件只能在一個容器中呈現,無法讓兩個容器同時展示同一個UI組件,簡單的理解就是說如果你在一個瀏覽器中新開一個同session的窗口將會導致只有一個窗口能顯示單類的組件,另一個的UI組件將會丟失。
1
import java.awt.BorderLayout;
2
import java.awt.GridLayout;
3
4
import javax.swing.JApplet;
5
import javax.swing.JPanel;
6
import javax.swing.JTextArea;
7
import javax.swing.border.TitledBorder;
8
9
class SinglePanel extends JPanel{
10
private final static SinglePanel instance = new SinglePanel();
11
public static SinglePanel getInstance(){
12
return instance;
13
}
14
private SinglePanel(){
15
TestApplet.initPanel(this, "single panel");
16
}
17
}
18
19
class MultiPanel extends JPanel{
20
public static MultiPanel getInstance(){
21
return new MultiPanel();
22
}
23
public MultiPanel(){
24
TestApplet.initPanel(this, "multi panel");
25
}
26
}
27
28
public class TestApplet extends JApplet {
29
30
public void init() {
31
JPanel contentPane = new JPanel(new GridLayout(2, 1));
32
contentPane.add(SinglePanel.getInstance());
33
contentPane.add(MultiPanel.getInstance());
34
this.setContentPane(contentPane);
35
}
36
37
public static void initPanel(JPanel panel, String title){
38
panel.setLayout(new BorderLayout());
39
panel.setBorder(new TitledBorder(title));
40
panel.add(new JTextArea(), BorderLayout.CENTER);
41
}
42
}

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
