Question

Je l'ai créé une interface graphique dans laquelle je l'ai utilisé un JFrame. Comment dois-je faire modales?

Était-ce utile?

La solution

Votre meilleur pari est d'utiliser un JDialog au lieu d'un JFrame si vous voulez faire le modal de la fenêtre. Vérifiez sur l'introduction de l'API Java 6 Modality pour info. Il y a aussi un tutoriel .

Voici quelques exemples de code qui affiche un JPanel panel dans un JDialog qui est modale à Frame parentFrame. Sauf pour le constructeur, cela suit le même schéma que l'ouverture d'un JFrame.

final JDialog frame = new JDialog(parentFrame, frameTitle, true);
frame.getContentPane().add(panel);
frame.pack();
frame.setVisible(true);

Modifier: Lien API mise à jour et Modality ajouté lien tutoriel (clin d'œil à @spork pour la bosse).

Autres conseils

Vous pouvez créer une classe qui est passé une référence à la JFrame mère et qu'elle détient dans une variable JFrame. Ensuite, vous pouvez verrouiller le cadre qui a créé votre nouveau cadre.

parentFrame.disable();

//Some actions

parentFrame.enable();

il suffit de remplacer JFrame à JDialog en classe

public class MyDialog extends JFrame // delete JFrame and write JDialog

et puis écrire setModal(true); dans le constructeur

Après cela, vous serez en mesure de construire votre formulaire dans NetBeans et la forme devient modal

  1. Créer un nouveau formulaire JPanel
  2. Ajoutez vos composants souhaités et le code à ce

YourJPanelForm stuff = new YourJPanelForm();
JOptionPane.showMessageDialog(null,stuff,"Your title here bro",JOptionPane.PLAIN_MESSAGE);


Votre boîte de dialogue modale attend ...

Pour autant que je sache, JFrame ne peut pas faire le mode Modal. Utilisez JDialog au lieu et appeler setModalityType(Dialog.ModalityType type) pour définir en tant que modal (ou non modal).

Si vous êtes prêt à utiliser un JDialog au lieu d'un JFrame, vous pouvez définir le ModalityType APPLICATION_MODAL .

Ceci fournit un comportement identique à votre JOptionPane typique:

import java.awt.event.ActionEvent;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;

public class MyDialog extends JFrame {

public MyDialog() {
    setBounds(300, 300, 300, 300);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
    setLayout(new FlowLayout());
    JButton btn = new JButton("TEST");
    add(btn);
    btn.addActionListener(new ActionListener() 
    {

        @Override
        public void actionPerformed(ActionEvent e) {
            showDialog();
        }
    });
}

private void showDialog() 
{

    JDialog dialog = new JDialog(this, Dialog.ModalityType.APPLICATION_MODAL);
    //OR, you can do the following...
    //JDialog dialog = new JDialog();
    //dialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);

    dialog.setBounds(350, 350, 200, 200);
    dialog.setVisible(true);
}

public static void main(String[] args) 
{
    new MyDialog();
}
}

Cette méthode d'utilité statique montre un DFrame modal en ouvrant secrètement un JDialog modal, aussi. J'ai utilisé ce succès et avec un comportement correct sur Windows 7, 8 et 10 avec-multiples-postes de travail.

Il est un bel exemple pour la fonction très rarement utilisé de locale classes.

import javax.swing.*;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

// ... (class declaration)

/**
 * Shows an already existing JFrame as if it were a modal JDialog. JFrames have the upside that they can be
 * maximized.
 * <p>
 * A hidden modal JDialog is "shown" to effect the modality.
 * <p>
 * When the JFrame is closed, this method's listener will pick up on that, close the modal JDialog, and remove the
 * listener.
 *
 * made by dreamspace-president.com
 *
 * @param window the JFrame to be shown
 * @param owner  the owner window (can be null)
 * @throws IllegalArgumentException if argument "window" is null
 */
public static void showModalJFrame(final JFrame window, final Frame owner) {

    if (window == null) {
        throw new IllegalArgumentException();
    }
    window.setModalExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDE);
    window.setVisible(true);
    window.setAlwaysOnTop(true);

    final JDialog hiddenDialogForModality = new JDialog(owner, true);
    final class MyWindowCloseListener extends WindowAdapter {
        @Override
        public void windowClosed(final WindowEvent e) {
            window.dispose();
            hiddenDialogForModality.dispose();
        }
    }

    final MyWindowCloseListener myWindowCloseListener = new MyWindowCloseListener();
    window.addWindowListener(myWindowCloseListener);

    final Dimension smallSize = new Dimension(80, 80);
    hiddenDialogForModality.setMinimumSize(smallSize);
    hiddenDialogForModality.setSize(smallSize);
    hiddenDialogForModality.setMaximumSize(smallSize);
    hiddenDialogForModality.setLocation(-smallSize.width * 2, -smallSize.height * 2);
    hiddenDialogForModality.setVisible(true);
    window.removeWindowListener(myWindowCloseListener);
}

Il y a un peu de code qui pourrait aider:

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class ModalJFrame extends JFrame {

    Object currentWindow = this;

    public ModalJFrame() 
    {
        super();
        super.setTitle("Main JFrame");
        super.setSize(500, 500);
        super.setResizable(true);
        super.setLocationRelativeTo(null);

        JMenuBar menuBar = new JMenuBar();
        super.setJMenuBar(menuBar);

        JMenu fileMenu = new JMenu("File");
        JMenu editMenu = new JMenu("Edit");

        menuBar.add(fileMenu);
        menuBar.add(editMenu);

        JMenuItem newAction = new JMenuItem("New");
        JMenuItem openAction = new JMenuItem("Open");
        JMenuItem exitAction = new JMenuItem("Exit");
        JMenuItem cutAction = new JMenuItem("Cut");
        JMenuItem copyAction = new JMenuItem("Copy");
        JMenuItem pasteAction= new JMenuItem("Paste");

        fileMenu.add(newAction);
        fileMenu.add(openAction);
        fileMenu.addSeparator();
        fileMenu.add(exitAction);

        editMenu.add(cutAction);
        editMenu.add(copyAction);
        editMenu.addSeparator();
        editMenu.add(pasteAction);

        newAction.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent arg0)
            {

                JFrame popupJFrame = new JFrame();

                popupJFrame.addWindowListener(new WindowAdapter()
                {
                      public void windowClosing(WindowEvent e) 
                      {
                          ((Component) currentWindow).setEnabled(true);                     }
                      });

                ((Component) currentWindow).setEnabled(false);
                popupJFrame.setTitle("Pop up JFrame");
                popupJFrame.setSize(400, 500);
                popupJFrame.setAlwaysOnTop(true);
                popupJFrame.setResizable(false);
                popupJFrame.setLocationRelativeTo(getRootPane());
                popupJFrame.setVisible(true);
                popupJFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
            }
        });

        exitAction.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent arg0)
            {
                System.exit(0);
            }
        });
    }
    public static void main(String[] args) {

        ModalJFrame myWindow = new ModalJFrame();
        myWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myWindow.setVisible(true);
    }
}

Ce que je l'ai fait dans ce cas, dans le JFrame primaire que je veux garder visible (par exemple, un cadre de menu), je décochez la focusableWindowState option dans la fenêtre de propriétés Il sera donc FALSE. Une fois cela fait, les JFrames j'appelle ne pas perdre le focus jusqu'à ce que je les ferme.

Comme d'autres ont mentionné, vous pouvez utiliser JDialog. Si vous n'avez pas accès au cadre parent ou que vous voulez geler l'application de trou juste passer null comme parent:

final JDialog frame = new JDialog((JFrame)null, frameTitle, true); frame.setModal(true);
frame.getContentPane().add(panel);
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.pack();
frame.setVisible(true);

pas que le contenu de votre JFrame, si vous demandez une entrée des utilisateurs, vous pouvez utiliser JOptionPane, cela peut également définir iFrame modal

            JFrame frame = new JFrame();
            String bigList[] = new String[30];

            for (int i = 0; i < bigList.length; i++) {
              bigList[i] = Integer.toString(i);
            }

            JOptionPane.showInputDialog(
                    frame, 
                    "Select a item", 
                    "The List", 
                    JOptionPane.PLAIN_MESSAGE,
                    null,
                    bigList,
                    "none");
            }

La façon la plus simple est d'utiliser le pack () méthode avant de visualiser la JFrame objet. voici un exemple:

myFrame frm = new myFrame();
frm.pack();
frm.setVisible(true);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top