Wie man ein JFrame-Modal in Swing-Java erstellt

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

Am besten verwenden Sie einen JDialog anstelle eines JFrames, wenn Sie das Fenster modal machen möchten. Weitere Informationen zur Einführung der Modality-API in Java 6 finden Sie hier . Es gibt auch ein Tutorial .

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

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

Edit: Aktualisierter Modality-API-Link und hinzugefügter Tutorial-Link (Nicken Sie auf @spork für den Bump).

Sie können eine class erstellen, die eine Referenz an den übergeordneten JFrame und in einer JFrame Variablen JFrame . Dann können Sie den Rahmen sperren, der Ihren neuen Rahmen erstellt hat.

 parentFrame.disable(); //Some actions parentFrame.enable(); 
  1. Erstellen Sie ein neues JPanel-Formular
  2. Fügen Sie Ihre gewünschten Komponenten und Code hinzu

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

Ihr modaler Dialog erwartet …

Ersetzen JFrame einfach JFrame zu JDialog in der class

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

und schreibe dann setModal(true); im Konstruktor

Danach können Sie Ihr Formular in Netbeans erstellen und die Form wird modal

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) setModalityType(Dialog.ModalityType type) .

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

Dies bietet das gleiche Verhalten wie bei Ihrem typischen JOptionPane:

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

Diese statische Hilfsmethode zeigt einen modalen JFrame, indem sie ebenfalls einen modalen JDialog öffnet. Ich habe dies erfolgreich und mit korrektem Verhalten unter Windows 7, 8 und 10 mit mehreren Desktops verwendet.

Es ist ein schönes Beispiel für das sehr selten genutzte Feature lokaler classn.

 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. * 

* A hidden modal JDialog is "shown" to effect the modality. *

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

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

Was ich in diesem Fall getan habe, ist, dass ich im primären jframe, das ich sichtbar halten möchte (zum Beispiel ein focusableWindowState ), die Option focusableWindowState im Eigenschaftsfenster focusableWindowState so dass sie FALSE . Sobald das erledigt ist, verlieren die jframes, die ich anrufe, den Fokus nicht, bis ich sie schließe.

nicht sicher die contentns von Ihrem JFrame, wenn Sie einige Eingaben von Benutzern fragen, können Sie JOptionPane verwenden, dies kann auch JFrame als modal setzen

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

Der einfachste Weg ist die Verwendung der pack () -Methode vor der Visualisierung des JFrame- Objekts. Hier ist ein Beispiel:

 myFrame frm = new myFrame(); frm.pack(); frm.setVisible(true);