web应用中有个session对象可以保存全局变量, 请问一下j2se桌面应用中如何设置一个全局变量,供其他的JFrame直接获取
 业务描述:用户登入,记录用户登入信息,输入用户名后,我加载了一个系统托盘,没有显示FrmMain窗口,可以通过点击右下角图标进行显示。我现在的实现方式:
1.登入窗口JFrame(FrmLogin)
            FrmMain frmMain = new FrmMain();
            frmMain.setUserInfo(identifiedResults);2.登入后界面JFrame(FrmMain)
public class FrmMain extends javax.swing.JFrame {    private String userInfo;    public void setUserInfo(String userInfo) {
        this.userInfo = userInfo;
    }    public FrmMain() {
        initComponents();
        this.setTitle("用户中心");
        this.setResizable(false);
        System.out.println("user info :" + userInfo); // 为什么这里没有获取数据
        if (userInfo != null) {
            String[] userInfoArr = userInfo.split("~");
            txUserName.setText(userInfoArr[2]);
            txDepName.setText(userInfoArr[4]);
        }        addSysTray();  // 加载系统托盘
    }加载系统托盘程序部分代码:
               .....
                trayIcon.addMouseListener(new MouseAdapter() {                    @Override
                    public void mouseClicked(MouseEvent e) {
                        if (e.getClickCount() == 2) {
                            setVisible(true);
                            System.out.println("user info :" + userInfo); // 这个地方有数据,不知道为什么
                            if (userInfo != null) {
                                String[] userInfoArr = userInfo.split("~");
                                txUserName.setText(userInfoArr[2]);
                                txDepName.setText(userInfoArr[4]);
                            }
                        }
                    }
                });不知道这样的方法可行,总感觉有点变扭,不是特别的方便, 因为我有很多的JFrame都会用到这个用户信息变量, 请大侠指点一下, 这个如何实现

解决方案 »

  1.   

    使用 java.util.prefs.Preferences
      

  2.   

    写一个Bean,里面存放所有全局的变量, 在不同界面进行切换的时候把这个bean进行传递。可以考虑使用 职责链模式。主要是保证在界面切换中不能丢失bean和不能重新new 。 全局只new 一次 ,然后在程序中传来传去。
    想改变的时候就set下 想获取的时候就get下
      

  3.   

    Inhibitory大侠,如果用静态变量,如何调用呢,每次使用用new ,这样也不合适吧,不知道怎么弄,指点一下huntor大侠,这个方法写注册表有点不妥,我的这个桌面应用可以同时打开多个,那不是很麻烦。而且无法确定登入的是哪个用户。Yalonexm大侠,你这个方法听上去不错, 能给个例子不
      

  4.   

    Inhibitory大侠,如果用静态变量,如何调用呢,每次使用用new ,这样也不合适吧,不知道怎么弄,指点一下
    class MyClass {
        public static int myVararible = 10;
    }使用: int x = MyClass.myVararible;
      

  5.   

    我喜欢做桌面应用程序,感觉挺有挑战性的,之前也遇到过类似的问题,看到楼主写出来,也分享一下我的经验啦/**
     * 全局类
     * @author guolw
     *
     */
    public final class Global {
    /**
     * 存放多个登录用户,泛型可以使Map<String, Userinfo>
     */
    public static final Map<String, String> LOGIN_USERS = new HashMap<>();


    private Global(){

    }

    }
    /**
     * 登录
     * @param userinfo
     */
    public void login(String userinfo){
    // 将登录的用户存放进去
    Global.LOGIN_USERS.put("userName", "UserEntity");
    }

    public String getLoginUserByName(String name){
    return Global.LOGIN_USERS.get(name);
    }上面将Global类中的LoginUsers设计为一个public类型的,这样外界就可以随意拿到这个Map集合,然后执行Map所以的操作,另外一种设计是,将其private化,然后提供访问接口。
    谢谢楼主的分享
      

  6.   

    谢谢楼上两位, 用 static实现确实最简单,而且合理。。长见识了。。再次谢谢。
      

  7.   

    搞不懂为什么你说static可行。 每次获取的时候都是一样的值 在ClassA中变了值后不会反应到ClassB中