从另一个表单java更改值

时间:2013-10-24 16:00:31

标签: java variables static

我有一个主表单(RandomSend)和另一个名为(_user)的表单 在randomsend形式中,我声明了一个公共静态变量:

 public class RandomSend extends javax.swing.JFrame {
 ......
public static String userGender; // this variable I want to change from another form (_user)
....
}

在RandomSend类中我声明_user实例试图改变 userGender

 _user setGender = new _user();
  setGender.setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE);
  setGender.setAlwaysOnTop(true);
  setGender.setVisible(true);

在_user表单(类)中,我尝试更改 userGender 值:

public class _user extends javax.swing.JFrame {......
     ....
     RandomSend.userGender="male";
     ....}

当我从 _user 中检查值时,RandomSend.userGender的值为“male”

但是从我的主窗体中,值为null ...


新的

我的尝试根据答案1 公共类RandomSend扩展了javax.swing.JFrame {

/**
 *
 */

private static String userGender;
 .....
.....
// show dialogbox to select gender...
 _user setGender = new _user();
  setGender.setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE);
  setGender.setAlwaysOnTop(true);
  setGender.setVisible(true);

....
....

// setter
public static void setUserGender(String gender)
{
    if(gender.toLowerCase().equals("female") ||gender.toLowerCase().equals("male"))
    userGender = gender;
    else userGender= "Unknown!!";
}

//getter
public static String getUserGender()
{
        return userGender;
 }

并在另一个类(框架)中:

public class _user extends javax.swing.JFrame {
....
....

RandomSend.setUserGender("male");
..
..
..
}

但是Randomsend.userGender没有改变!

1 个答案:

答案 0 :(得分:2)

您可以通过使用在该对象上定义的getter和setter函数来更改对象成员值。要使用您的示例,您最终会得到以下内容:

public class RandomSend extend javax.swing.JFrame {
    // This should be preferred for values that can mutate (non-final) to prevent
    // modification without the owning class being alerted the value is changing
    private static String userGender;

    public static void setUserGender(String value) {
        userGender = value;
    }

    public static String getUserGender() {
        return userGender;
    }
}

使用此示例,您可以通过调用RandomSend.setUserGender("male")更改值,然后通过调用RandomSend.getUserGender()来读取此值。

一些附加说明

我只是想指出一些我注意到的关于你的样品的其他事情。以您的方式使用static值不一定是最好的主意。你以错误的方式锁定了课程的使用。您应该维护User类的实例或管理特定于用户的信息的其他类别的实例,例如性别。通过在类上管理实例而不是静态值,您可以更轻松地处理应用程序中的其他用户(如果需要的话)。如果您确定永远不需要支持超过当前用户,那么您仍然可以使用实例,但使用singleton pattern实现它。

这看起来像是:

public class SingletonExample {
    private static SingletonExample instance = null;

    // Declared private to prevent new SingletonExample 
    // outside of this class
    private SingletonExample {} 

    public static SingletonExample getInstance() {
        if (instance == null) {
            instance = new SingletonExample();
        }

        return instance;
    }
}

您可以通过提取SingletonExample.getInstance()之类的实例来使用此类,然后对该实例进行操作。使用这种方法可以保证在项目的所有点上访问同一个对象的同一个实例,从某种意义上说就是“全局”。

我想提出的另一个注意事项是尝试使用final值或更好,enum代替字符串,例如性别,您最有可能将其用作值。我这样说是因为为了正确比较你必须要做的性别:

if (RandomSend.userGender.equals("male")) {
    // ...
}

如果您改为创建一个Gender类,其常量如下:

public Gender {
    public static final int MALE = 1;
    public static final int FEMALE = 2;
}

比较(在适当的类中提供值变化)

if (RandomSend.userGender == Gender.MALE) {
    // ...
}

不再浪费字符串文字。这是一个很好的想法,Java有一个独特的完整结构来提供这个名为enum的解决方案。您可以像这样定义Gender枚举:

public enum Gender {
    MALE,
    FEMALE;
}

然后您将userGender声明为Gender值,并且您的比较与您自己从具有常量值的类构建枚举时相同。从长远来看,这些变化可以使您的项目更易于管理,更易于维护。