it-swarm.com.de

So erstellen Sie ein JFrame Modal in Swing Java

Ich habe eine GUI erstellt, in der ich einen JFrame verwendet habe. Wie soll ich es modal machen?

58
om.

Am besten verwenden Sie einen JDialog anstelle eines JFrames, wenn Sie das Fenster modal machen möchten. Check out Details zur Einführung der Modality API in Java 6 für Informationen. Es gibt auch ein Tutorial

Hier ist ein Beispielcode, der einen JPanel panel in einer JDialog anzeigt, der modal zu Frame parentFrame ist. Mit Ausnahme des Konstruktors folgt dies dem gleichen Muster wie das Öffnen einer JFrame.

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

Bearbeiten: Aktualisierter Modality-API-Link & Tutorial-Link hinzugefügt (Nock an @spork für den Bump). 

59
akf

Sie können eine Klasse erstellen, an die eine Referenz an die übergeordnete JFrame übergeben wird, und diese in einer JFrame-Variablen enthalten. Dann können Sie den Frame sperren, mit dem Ihr neuer Frame erstellt wurde. 

parentFrame.disable();

//Some actions

parentFrame.enable();
15
Kamil

ersetzen Sie einfach JFrame in JDialog in der Klasse

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

und dann setModal(true); in den Konstruktor schreiben

Danach können Sie Ihr Formular in netbeans Erstellen und das Formular wird modal

7
Ivan
  1. Erstellen Sie ein neues JPanel-Formular
  2. Fügen Sie die gewünschten Komponenten und den Code hinzu

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


Ihr modaler Dialog wartet auf ...

Soweit ich weiß, kann JFrame den Modal-Modus nicht ausführen. Verwenden Sie stattdessen JDialog und rufen Sie setModalityType(Dialog.ModalityType type) auf, um es als modal (oder nicht modal) festzulegen.

4
NawaMan

Wenn Sie bereit sind, einen JDialog anstelle eines JFrames zu verwenden, können Sie ModalityType auf APPLICATION_MODAL setzen.

Dies stellt ein identisches Verhalten zu Ihrem typischen JOptionPane dar:

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
Stephen Paul

Diese statische Utility-Methode zeigt einen modalen JFrame, indem auch ein modaler JDialog heimlich geöffnet wird. Ich habe dies erfolgreich und mit korrektem Verhalten unter Windows 7, 8 und 10 mit mehreren Desktops verwendet.

Dies ist ein schönes Beispiel für die sehr selten genutzte Funktion von local 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);
}

Was ich in diesem Fall getan habe, ist, dass ich in dem primären jframe, das ich sichtbar halten möchte (z. B. ein Menüframe), die Option focusableWindowState im Eigenschaftsfenster deaktivieren, sodass FALSE angezeigt wird. Sobald dies erledigt ist, verlieren die Bilder, die ich anrufe, nicht den Fokus, bis ich sie schließe.

0
Johan Rincon

Wie bereits erwähnt, können Sie JDialog verwenden. Wenn Sie keinen Zugriff auf den übergeordneten Frame haben oder die gesamte Anwendung einfrieren möchten, übergeben Sie einfach null als übergeordnetes Element:

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);

0
Daniel Shamaeli

Es gibt ein bisschen Code, der helfen könnte:

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