1

2 つの JPanelとframeを含むJFrameがあり、このパネルに 1 つの JButton があるとします。クリックすると、JDialog が作成され、独自のウィンドウに (通常どおり) 表示されます。複数の JTextField と送信ボタンを使用して、JDialogはこれらの入力データをカプセル化する新しいオブジェクトを作成します。メイン アプリケーションの JPanel にこれを表示させたい場合、外部 JFrame に存在する JPanelにどのように適切に渡す必要がありますか?buttonPaneldataPanelbuttonbuttondialogdialogdataObjectdataPanelframedataObjectdataObject

それを書いている間、それは私にとっても一口だったので、明確にしようとします:

JFrameframe

  • JPanel dataPanel- JDialog で作成されたオブジェクトからのデータを表示するためのもの
  • JPanel buttonPanel- JDialog を開くためのボタンが含まれており、そこにいくつかの情報が入力され、その情報を使用してオブジェクトdataObjectが構築されます。

ここでの目標は、これdataObject(およびそれを構成するフィールド) をに渡してdataPanel表示することです。これを処理する最も適切な方法は何ですか? オブジェクトをdataPanel静的に保持し、JDialog から静的メソッドを呼び出して新しいオブジェクトを追加することを検討しましたが、適切なことではないようです。

いくつかのガイダンス?

4

1 に答える 1

2

ダイアログがどのように動作するかを含め、プログラムの構造に大きく依存します。

  • JDialog がモーダルであり、送信ボタンが押されたときに消える場合、解決策は簡単です。ダイアログを表示した直後のコード行である戻り後に、ダイアログ関連のクラスからデータを抽出します。ダイアログのサブミット JButton のリスナーは、単純にダイアログを非表示にすることができます。
  • それ以外の場合、JDialog が非モーダルで、送信ボタンが押されたときに消える場合は、Listener をその Window にアタッチし、WindowListener だと思います。ダイアログが閉じられたか、閉じようとしています。
  • それ以外の場合、JDialog が非モーダルで、送信ボタンが押されたときに非表示になることは想定されていないが、呼び出しプログラムを新しいデータで更新する必要がある場合は、呼び出しクラスに PropertyChangeListener をダイアログ関連に追加します。ダイアログ関連のクラスが、サブミットが押されたことをリスナーに通知できるようにします。このコードは、ダイアログのサブミット JButton のリスナーにあります。
  • ダイアログ関連のクラスにpublic DataObject getDataObject()、ダイアログが返されたときに呼び出し元のコードが呼び出すことができるメソッドを提供し、ダイアログを表示するクラスが必要に応じて関連情報を抽出できるようにします。
  • 何をするにしても、静的フィールドを使用する理由はなく、使用しない理由はたくさんあります。これを考慮しないことを強くお勧めします。

返すモーダルダイアログの例:

// caveat: code has not been tested by compilation or running. 
JButton myButton = new JButton(new AbstractAction("Show Dialog Button") {
  public void actionPerformed(ActionEvent evt) {
    MyDialogPanel myDialogPanel = new MyDialogPanel();
    JDialog myDialog = new JDialog(myJFrame, "My Dialog", 
            ModalityType.APPLICATION_MODAL);
    myDialog.add(myDialogPanel);
    myDialog.pack();
    myDialog.setLocationRelativeTo(myJFrame);
    myDialog.setVisible(true);

    // dialog now returns and we can get the data
    // assuming that the wrapper object for your data 
    // is called "DataObject"
    DataObject dataObject = myDialogPanel.getDataObject();

    // and perhaps use it. Assume setDataObject is a method 
    // of the main GUI that displays the data object
    setDataObject(dataObject);
  }
});
于 2013-04-06T20:53:56.287 に答える