0

我正在集成一个小程序,我需要破解其中一个对话框并更改其模式。

我的问题是我不懂 Swing,而且我的尝试在实践中没有效果。

当前实施:

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

也试过

dialog.setModal(false);

所以有我的问题。如何动态更改现有 JDialog 的模态?

4

4 回答 4

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

要更改您的对话框是模态的还是无模态的,请使用setModalityType方法。

当您更改其模式时,该对话框应该不可见。否则,直到对话框被隐藏然后再次显示时才会生效。

此外,必须对对话框本身进行编程以支持不同的模态模式。

  • 当您使用模式对话框时,与所有者窗口(以及可能与其他应用程序窗口)的交互被阻止。因此,您显示对话框,dialog.setVisible(true)并且此方法在对话框关闭之前不会返回。然后使用对话框中的数据。
    典型的模式对话框是打开文件:应用程序在知道要加载哪个文件之前无法继续。
  • 在无模式对话框的情况下,该方法dialog.setVisible(true)立即返回(在屏幕上显示对话框之后)。在对话框中按下按钮通常会对其他窗口和对话框产生一些影响。您可以在显示对话框时与应用程序的其他窗口进行交互。
    例如,典型的“查找”对话框会在主窗口中选择一个搜索字符串。您可以返回主窗口,更改文本,然后再次单击查找,依此类推。

如果您需要更多帮助,我可以向您展示一个带有对话框的工作示例,该示例可以在两种模式下工作:模态和非模态。

于 2012-11-14T21:44:51.043 回答
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);
    }
}

(此代码需要番石榴)

最后称之为:

final Dialog myDialog = ...;

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

我猜你还没有获得AWTPermission.toolkitModality你的小程序的许可。

另一个问题可能是您的平台不支持排除类型 - 您可以使用Toolkit.isModalExclusionTypeSupported(java.awt.Dialog.ModalExclusionType).

于 2012-11-12T17:19:31.383 回答