6

windowBuilderを使用してカスタムJDialogを作成しようとしていますが、最初はいくつかの問題に直面していました。だからここにあります:

windowBuilderを使用して簡単なJdialogを作成しました。ここにコードがあります:

public class GroupFrame extends JDialog {

    private final JPanel contentPanel = new JPanel();

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        try {
            GroupFrame dialog = new GroupFrame();
            dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            dialog.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Create the dialog.
     */
    public GroupFrame() {
        setBounds(100, 100, 450, 300);
        getContentPane().setLayout(new BorderLayout());
        contentPanel.setLayout(new FlowLayout());
        contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
        getContentPane().add(contentPanel, BorderLayout.CENTER);
        {
            JPanel buttonPane = new JPanel();
            buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
            getContentPane().add(buttonPane, BorderLayout.SOUTH);
            {
                JButton okButton = new JButton("OK");
                okButton.setActionCommand("OK");
                buttonPane.add(okButton);
                getRootPane().setDefaultButton(okButton);
            }
            {
                JButton cancelButton = new JButton("Cancel");
                cancelButton.setActionCommand("Cancel");
                buttonPane.add(cancelButton);
            }
        }
    }

}

しかし、次にpublic static void main(String [] args)をpublic void show()のようなものに変更したいと思います。

新しいshow()メソッドコードは次のとおりです。

public void show() {
        try {
            GroupFrame dialog = new GroupFrame();
            dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            dialog.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

したがって、次のコードを使用してこの変更されたメソッドを呼び出そうとすると、次のようになります。

GroupFrame groupFrame = new GroupFrame();
groupFrame.show(); 

StackOverflowErrorが発生しました(偶然です!; D):

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
    at sun.awt.Win32GraphicsConfig.getBounds(Native Method)
    at sun.awt.Win32GraphicsConfig.getBounds(Unknown Source)
    at java.awt.Window.init(Unknown Source)
    at java.awt.Window.<init>(Unknown Source)
    at java.awt.Window.<init>(Unknown Source)
    at java.awt.Dialog.<init>(Unknown Source)
    at java.awt.Dialog.<init>(Unknown Source)
    at javax.swing.JDialog.<init>(Unknown Source)
    at javax.swing.JDialog.<init>(Unknown Source)
    at javax.swing.JDialog.<init>(Unknown Source)
    at UILayer.GroupFrame.<init>(GroupFrame.java:32)
    at UILayer.GroupFrame.show(GroupFrame.java:21)
    at java.awt.Component.show(Unknown Source)
    at java.awt.Component.setVisible(Unknown Source)
    at java.awt.Window.setVisible(Unknown Source)
    at java.awt.Dialog.setVisible(Unknown Source)
    at UILayer.GroupFrame.show(GroupFrame.java:23)
    at java.awt.Component.show(Unknown Source)
    at java.awt.Component.setVisible(Unknown Source)
    at java.awt.Window.setVisible(Unknown Source)
    at java.awt.Dialog.setVisible(Unknown Source)
    at UILayer.GroupFrame.show(GroupFrame.java:23)
    (etc...)

誰かが私が間違っていることを私に指摘できますか?

前もって感謝します!

4

2 に答える 2

4

GroupFrameを作成し、別のGroupFrameを作成するshow()メソッドを呼び出します。これはすでに間違っています。しかし、それはさらに間違っています。それは、誤って上書きしsetVisible(true)たメソッドを内部的に呼び出す呼び出しを行うためです。show()

showメソッドには別の名前を付け、静的にする必要があります。

public static GroupFrame createAndShow() {
    GroupFrame dialog = new GroupFrame();
    dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    dialog.setVisible(true);
}

したがって、このメソッドは次のように呼び出されます。

GroupFrame.createAndShow();

そして、例外をキャッチしないでください。そして、あなたがそれをするとき、例外を飲み込まないでください。

于 2012-05-10T10:25:08.153 に答える
3

しかし、次にpublic static void main(String [] args)をpublic void show()のようなものに変更したいと思います。

それはできません。正確な署名を持つmainメソッドは、Javaプログラムの開始点です(すべてではありませんが、ほとんどの場合)。

必要なのは、showダイアログを表示する別の方法です

編集:

クラスが拡張JDialogされていることに注意してください。つまり、showを再度定義すると、に存在するメソッドが技術的にオーバーライドされDialog、さらにshowは非推奨になります。

ドキュメントから:

非推奨。JDKバージョン1.5以降、setVisible(boolean)に置き換えられました。

ダイアログを表示します。ダイアログおよび/またはその所有者がまだ表示できない場合は、両方が表示可能になります。ダイアログは、表示される前に検証されます。ダイアログがすでに表示されている場合は、ダイアログが前面に表示されます。ダイアログがモーダルでまだ表示されていない場合、hideまたはdisposeを呼び出してダイアログが非表示になるまで、この呼び出しは戻りません。ツールキットは、このメソッドを呼び出したものがブロックされている間、別のイベントポンプが実行されることを保証するため、イベントディスパッチスレッドからのモーダルダイアログを表示することは許可されています。

代わりにこれを使用してください:

public static void showMyDialog(){
    try {
         GroupFrame dialog = new GroupFrame();
         dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
         dialog.setVisible(true);
    } catch (Exception e) {
         e.printStackTrace();
    }
}

そしてあなたのメインメソッドであなたはを呼び出しますshowMyDialog

ただし、Javaアプリケーションとして実行する場合は、mainメソッドがクラスに存在する必要があります。他のクラスがshowメソッドを呼び出す場合は、クラスにmainメソッドが存在する必要はありません。

于 2012-05-10T10:14:24.743 に答える