0

次のシナリオを検討してください。

別のJFrame「CaravanData 」を開くjButton「 caravanDataButton 」を持つJFrame「Main」があります。

CaravanDataにはいくつかのJTextFieldがあります。その目的は、ユーザーに質問をし、ユーザーが完了したら回答をメインに転送することです。

私の質問:子JFrameから呼び出し元の親JFrameにデータを転送する最も効率的な方法は何ですか(またはこの例からCaravanDataからMainに戻る)

理想的には、次のことを行いたいと思います。

class Main
{
    public Main
    {
        CustomVariable data = new CaravanData();
    }
}

ただし、コンストラクターには戻り型がありません。ただし、クラスCaravanDataがビジネスを終了するまで変数「データ」に値が割り当てられないため、これが最善の方法です。

私の代替ソリューションは、ゲッターとセッターを使用することです。ただし、データを取得する前に、ユーザーがフォームに入力するまで待つ必要があります。whileループを使用しました:

class Main
{
    public Main
    {
        CaravanData caravanData = new CaravanData();
        while (caravanData.isUserFinished == false) 
        {//...Do nothing}

        // Once the user has finished - collect the data:
        CustomVariable data = caravanData.getRelevantData();
    }
}


class CaravanData
{
    ...
    public boolean isUserFinished() 
    {return ifUserHasCompletedForm;}

    public CustomerVariable getRelevantData()
    {
        ...
        return data;
    }
}

この方法はまったく効率的ではないと思います。より良いテクニックはありますか?質問がたくさんあるので、JFrameをいくつか持っています。ネットで答えを見つけるためにこれをどのように表現するかわかりませんでした。スレッドを使うことを考えましたか?もう一方が終了するまで一方のプロセスを停止します。しかし、タスクがEDTから多くの時間を消費する場合にのみスレッドを使用するという印象を受けましたか?

4

1 に答える 1

1

子ウィンドウとしてJDialogを使用してみてください。setVisible(true)JDialogのメソッドは、ダイアログが破棄されるまでブロックします(通常setVisible(false)はダイアログ内から呼び出すことによって)

その後、getRelevantData()メソッドですべてのデータをロードできます。

 class Main
 {
     public Main
     {
         CaravanData caravanData = new CaravanData();
         // Show the dialog - setVisible(true) blocks till ok is pressed
         caravanData.setVisible(true);

         // Once the user has finished - collect the data:
         CustomVariable data = caravanData.getRelevantData();
     }
 }

class CaravanData extends JDialog
{
    ...
    // Called by an ActionListener for the OK Button
    private void okButtonPressed(){
         setVisible(false);
    }

    public CustomerVariable getRelevantData()
    {
       ...
       return data;
    }
}
于 2012-12-12T14:33:21.960 に答える