1

同時に表示される複数のインスタンスを表示する必要があるモードレス ダイアログがあります。ダイアログを新規作成してダイアログを表示するクラスのメンバー変数として保持しました。ここにはダイアログの複数のインスタンスが表示されていますが、同じメンバー変数に割り当てています(一部の処理のためにメンバー変数として持つ必要があります)。正常に機能していますが、なぜこれが機能しているのかわかりません。私は非常に明白な何かを逃していますか?

public class ABC {
    CMyDialog m_dlg;

    onSomeEvent() {
       m_dlg = new CMyDialog();
    }
}

onSomeEventが複数回呼び出され、複数のダイアログが表示されます。Javaがこれらのことをどのように管理するか考えていますか? 単一のクラスではなく、メンバー変数として CMyDialog の配列を保持する必要がありますか?

どんな助けでも大歓迎です。

前もって感謝します。ニチン K.

4

2 に答える 2

1

デフォルトのクローズ操作JDialogですHIDE_ON_CLOSE複数のダイアログが必要ない場合は、1つだけ作成して、表示することができますonSomeEvent()。この例では、トグルボタンのitemStateChanged()ハンドラーを使用しています。

import java.awt.EventQueue;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.*;

/** @see http://stackoverflow.com/questions/5528408 */
public class DialogToggle extends JPanel {

    private static final String show = "Show Dialog";
    private static final String hide = "Hide Dialog";
    MyDialog myDialog = new MyDialog();

    public DialogToggle() {
        final JToggleButton b = new JToggleButton(show);
        b.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                if (b.isSelected()) {
                    myDialog.setVisible(true);
                    b.setText(hide);
                } else {
                    myDialog.setVisible(false);
                    b.setText(show);
                }
            }
        });
        this.add(b);
    }

    private class MyDialog extends JDialog {

        public MyDialog() {
            this.setLocationRelativeTo(DialogToggle.this);
            this.add(new JLabel("Hello, world!", JLabel.CENTER));
        }
    }

    private void display() {
        JFrame f = new JFrame("ABC");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new DialogToggle().display();
            }
        });
    }
}
于 2011-04-03T09:12:39.050 に答える
0

表示されるダイアログのインスタンスはいくつかありますが、それぞれがメインメモリ内の個別のスペースを占有します。変数名は同じでもかまいませんが、すべてのダイアログインスタンスが同じメモリを共有しているわけではありません。これがあなたが求めていたものであることを願っています。

于 2011-04-03T08:15:41.830 に答える