0

メイン フォーム (RandomSend) と別のフォーム (_user) がランダム送信フォームにあり、public static変数を宣言します。

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

RandomSend クラスで、 userGender値を変更しようとする _user インスタンスを宣言しました

 _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の値は「男性」です

しかし、私のメインフォームから値はnullです...


新しい 新しい

私の試み回答番号1によると public class RandomSend extends 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 は変わりません!

4

1 に答える 1

2

オブジェクトで定義したゲッター関数とセッター関数を使用して、オブジェクトのメンバー値を変更します。あなたの例を使用するには、次のようになります。

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性別など、ユーザー固有の情報を管理するクラスまたはその他の種類のクラスのインスタンスを維持する必要があります。クラスの静的な値の代わりにインスタンスを管理することで、必要が生じた場合にアプリケーション内で他のユーザーを簡単に処理できるようになります。現在のユーザー以上をサポートする必要がないことが確実な場合は、引き続きインスタンスを使用できますが、シングルトン パターンで実装できます。

それは次のようになります。

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()てから、そのインスタンスを操作します。このメソッドを使用すると、プロジェクトのすべてのポイントで、同じオブジェクトの同じインスタンスにアクセスし、ある意味で「グローバル」になることが保証されます。

もう 1 つ注意したいのは、値として使用する可能性が最も高い性別などの文字列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 にはenums. Gender次のように列挙型を定義します。

public enum Gender {
    MALE,
    FEMALE;
}

userGender次に、値として宣言するGenderと、比較は、定数値を持つクラスから自分で列挙型を構築した場合と同じになります。これらの変更は、長期的には、プロジェクトをより管理しやすく、維持しやすくすることができます。

于 2013-10-24T16:05:51.983 に答える