0

アプレットを統合していますが、ダイアログの 1 つをハックしてそのモダリティを変更する必要があります。

私の問題は、私が Swing を知らないことであり、私の試みは実際には効果がありません。

現在の実装:

dialog.setModalExclusionType(ModalExclusionType.TOOLKIT_EXCLUDE);
dialog.repaint();

も試した

dialog.setModal(false);

それで私の質問があります。既存の JDialog のモダリティを動的に変更するにはどうすればよいですか?

4

4 に答える 4

1

ダイアログがモーダルかモードレスかを変更するには、setModalityTypeメソッドを使用します。

  • を呼び出す場合setModal(true)、モダリティ タイプは を呼び出す場合と同じsetModalityType(Dialog.DEFAULT_MODALITY_TYPE)です。デフォルト値は ですModalityType.APPLICATION_MODAL
  • を呼び出すとsetModal(false)、モダリティ タイプが に設定されModalityType.MODELESSます。

モダリティを変更すると、ダイアログが表示されないようにする必要があります。そうしないと、ダイアログが非表示になり、再び表示されるまで有効になりません。

さらに、ダイアログ自体は、さまざまなモダリティ モードをサポートするようにプログラムする必要があります。

  • モーダル ダイアログを使用すると、オーナー ウィンドウ (および場合によっては他のアプリケーション ウィンドウ) との対話がブロックされます。したがって、ダイアログを表示するdialog.setVisible(true)と、このメソッドはダイアログが閉じられるまで戻りません。次に、ダイアログのデータを使用します。
    典型的なモーダル ダイアログは [ファイルを開く] です。アプリケーションは、ロードするファイルを認識するまで先に進みません。
  • モードレス ダイアログの場合、メソッドdialog.setVisible(true)はすぐに戻ります (ダイアログを画面に表示した後)。ダイアログ内のボタンを押すと、通常、他のウィンドウやダイアログに何らかの影響があります。また、ダイアログが表示されている間、アプリケーションの他のウィンドウと対話できます。
    たとえば、典型的な検索ダイアログは、メイン ウィンドウで検索文字列を選択します。メイン ウィンドウに戻ってテキストを変更し、[検索] をもう一度クリックします。

さらにヘルプが必要な場合は、モーダル モードとモードレス モードの両方で動作するダイアログ付きのサンプルをお見せします。

于 2012-11-14T21:44:51.043 に答える
1

何をしようとしているのかわかりません...でも、ここから何かを得ることができるかもしれません

   public class Mainz extends JFrame implements ActionListener{
                JButton showDialog = new JButton("show dialog");

                public Mainz() {
                    setLayout(new FlowLayout());
                    showDialog.addActionListener(this);
                    add(showDialog);
                    setSize(200, 300);
                    setVisible(true);   
                }
                @Override
                public void actionPerformed(ActionEvent e) {
                    new Dialogz(this, false);
                    setEnabled(false);
                }

                public static void main(String[]args){
                    new Mainz();
            }
            }
            class Dialogz extends JDialog{
                JButton close = new JButton("close");


                public Dialogz(JFrame owner,boolean modal) {
                    super(owner, modal);
                    setSize(100, 200);
                    add(close);
                    setLocationRelativeTo(owner);
                    setVisible(true);

                    close.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent ae){
                            closez();
                        }
                    });
                } 

                void closez(){
                    setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE);
                    System.out.println("modal exclusion befor = "+getModalExclusionType());
                    setModalExclusionType(ModalExclusionType.NO_EXCLUDE);
                    System.out.println("modal exclusion after = "+getModalExclusionType());

                    System.out.println("modality before ="+getModalityType());
                    setModal(true);
                    System.out.println("modality  after ="+getModalityType());
                    getOwner().setEnabled(true);
                    Dialogz.this.dispose();
                }
            }
于 2012-11-08T17:24:20.467 に答える
1

ハックのためのハック:

プライベート メソッドを呼び出すことで、既存のダイアログのモダリティを変更できます。

java.awt.Dialog.hideAndDisposePreHandler();

このプライベート メソッドを呼び出すには - 例として:

private void executeMethod(final Class<?> clazz, final String methodName, final Object instance)
{
    final Method method =
        Iterables.getOnlyElement(Iterables.filter(
            Arrays.asList(clazz.getDeclaredMethods()), new Predicate<Method>()
            {
                public boolean apply(final Method method)
                {
                    return method.getName().equals(methodName);
                }
            }));

    method.setAccessible(true);
    try
    {
        method.invoke(instance);
    }
    catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e)
    {
        throw Throwables.propagate(e);
    }
}

(このコードには Guava が必要です)

そして最後にそれを呼び出します:

final Dialog myDialog = ...;

executeMethod(Dialog.class, "hideAndDisposePreHandler", myDialog);
于 2012-11-16T16:31:39.797 に答える
0

AWTPermission.toolkitModalityアプレットの許可を取得していないと思います。

もう1つの問題は、除外タイプがプラットフォームでサポートされていないことである可能性があります。これはで確認できますToolkit.isModalExclusionTypeSupported(java.awt.Dialog.ModalExclusionType)

于 2012-11-12T17:19:31.383 に答える