Comment faire un JFrame Modal dans Swing java

J'ai créé une interface graphique dans laquelle j'ai utilisé un JFrame. Comment devrais-je le rendre Modal?

56
demandé sur Michael Myers 2009-09-26 19:07:37

11 réponses

Votre meilleur pari est d'utiliser un JDialog au lieu d'un JFrame si vous voulez rendre la fenêtre modale. Consultez détails sur l'introduction de L'API de modalité en Java 6 pour plus d'informations. Il y a aussi un tutoriel.

Voici un exemple de code qui affichera un JPanel panel dans un JDialog qui est modal à Frame parentFrame. À l'exception du constructeur, cela suit le même modèle 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 de modalité mise à jour et lien tutoriel ajouté (clin d'œil à @ spork pour bosse).

57
répondu akf 2015-06-02 13:26:10

Vous pouvez créer une classe à laquelle une référence est transmise au parent JFrame et la contient dans une variable JFrame. Ensuite, vous pouvez verrouiller le cadre qui a créé votre nouveau cadre.

parentFrame.disable();

//Some actions

parentFrame.enable();
15
répondu Kamil 2017-09-17 18:24:10
  1. Créer un nouveau formulaire JPanel
  2. Ajoutez-y les composants et le code souhaités

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


Votre boîte de dialogue modale vous attend...

6
répondu Richard Kenneth Niescior 2014-01-21 00:40:16

Il suffit de remplacer JFrame à JDialog dans la classe

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

Puis écrivez setModal(true); dans le constructeur

Après cela, vous pourrez construire votre formulaire dans netbeans et la forme devient modale

6
répondu Ivan 2015-02-11 18:40:26

Pour autant que je sache, JFrame ne peut pas faire le mode Modal. Utilisez JDialog à la place et appelez setModalityType(Dialog.ModalityType type) pour le Définir comme modal (ou non modal).

4
répondu NawaMan 2015-05-08 13:31:41

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

Cela 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();
}
}
1
répondu Stephen Paul 2014-02-21 09:01:15

Cette méthode utilitaire statique montre un JFrame modal en ouvrant secrètement un JDialog modal. J'ai utilisé cela avec succès et avec un comportement approprié sur Windows 7, 8 et 10-avec-plusieurs-bureaux.

C'est un bon exemple pour la fonctionnalité très rarement utilisée des classes local.

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);
}
1
répondu Dreamspace President 2015-11-28 07:55:19

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);
    }
}
0
répondu The Codartofonist 2013-05-17 07:33:16

Ce que j'ai fait dans ce cas, c'est que dans le jframe principal que je veux garder visible (par exemple, un cadre de menu), Je désélectionne l'option focusableWindowState dans la fenêtre de propriété, donc ce sera FALSE. Une fois cela fait, les jframes que j'appelle ne perdent pas le focus jusqu'à ce que je les ferme.

0
répondu Johan Rincon 2014-10-31 07:55:43

Pas sûr des contetns de votre JFrame, si vous demandez des informations aux utilisateurs, vous pouvez utiliser JOptionPane, cela peut également définir JFrame comme 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");
            }
-2
répondu Ryan 2012-10-23 15:08:20

Le moyen le plus simple est d'utiliser la méthode pack() avant de visualiser l'objet JFrame. voici un exemple:

myFrame frm = new myFrame();
frm.pack();
frm.setVisible(true);
-2
répondu Dahab 2017-03-25 17:07:51