TWaver - 专注UI技术

http://twaver.servasoft.com/
posts - 171, comments - 191, trackbacks - 0, articles - 2
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Applet中避免单类模式使用UI组件

Posted on 2010-08-29 09:14 TWaver 阅读(1242) 评论(0)  编辑  收藏
单类为了啥:保证实例唯一;提供全局函数;减少内存消耗;…. 也许还有很多很多用途,不过在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组件将会丢失。

 

 1import java.awt.BorderLayout;
 2import java.awt.GridLayout;
 3
 4import javax.swing.JApplet;
 5import javax.swing.JPanel;
 6import javax.swing.JTextArea;
 7import javax.swing.border.TitledBorder;
 8
 9class 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
19class 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
28public class TestApplet extends JApplet {
29
30    public void init() {
31     JPanel contentPane = new JPanel(new GridLayout(21));
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}

只有注册用户登录后才能发表评论。


网站导航: