Как сделать JFrame Modal в Swing java

Я создал один GUI, в котором я использовал JFrame. Как мне сделать это модальным?

Лучше всего использовать JDialog вместо JFrame, если вы хотите сделать мода модальным. Ознакомьтесь с информацией о внедрении API модальности в Java 6 для получения информации. Существует также учебник .

Вот пример кода, который отображает JPanel panel в JDialog которая является модальной для Frame parentFrame . За исключением конструктора, это следует за тем же шаблоном, что и открытие JFrame .

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

Изменить: обновлена ​​ссылка API модальности и добавлена ​​ссылка для учебника (кивок в @spork для ударной волны).

Вы можете создать class, которому передается ссылка на родительский JFrame и удерживает его в переменной JFrame . Затем вы можете заблокировать фрейм, который создал ваш новый фрейм.

 parentFrame.disable(); //Some actions parentFrame.enable(); 
  1. Создать новую форму JPanel
  2. Добавьте к нему нужные компоненты и код

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

Ваш модальный диалог ждет …

просто замените JDialog на JDialog в classе

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

а затем напишите setModal(true); в конструкторе

После этого вы сможете создать свою форму в netbeans, и форма станет модальной

Насколько мне известно, JFrame не может работать в режиме Modal. Вместо этого используйте JDialog и вызывайте setModalityType(Dialog.ModalityType type) чтобы установить его модальным (или не модальным).

Если вы готовы использовать JDialog вместо JFrame, вы можете установить ModalityType в APPLICATION_MODAL .

Это обеспечивает идентичное поведение вашего типичного 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(); } } 

Этот статический метод полезности показывает модальный JFrame, тайно открывая модальный JDialog. Я использовал это успешно и с правильным поведением в Windows 7, 8 и 10-с-несколькими-рабочими столами.

Это хороший пример для очень редко используемой функции локальных classов.

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

Есть немного кода, который может помочь:

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

То, что я сделал в этом случае, в основном jframe, которое я хочу сохранить видимым (например, фрейм меню), отменил выбор опции focusableWindowState в окне свойств, чтобы он был FALSE . Как только это будет сделано, jframes, которые я называю, не теряет фокуса, пока я не закрою их.

не уверенный в деталях вашего JFrame, если вы спросите какой-нибудь вход от пользователей, вы можете использовать JOptionPane, это также может установить JFrame как модальный

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

Самый простой способ – использовать метод pack () перед визуализацией объекта JFrame . вот пример:

 myFrame frm = new myFrame(); frm.pack(); frm.setVisible(true); 
  • Заполнение combobox из базы данных с помощью hibernate в Java
  • Просмотрите файл изображения и покажите его с помощью Java Swing
  • Доступ к компонентам GUI из другого classа
  • События мыши JLabel для перетаскивания
  • Как программно закрыть JFrame
  • MouseMotionListener в Java Swing, используя его с компонентами внутри компонентов и т. Д.
  • Качание на OSX: как ловушка command-Q?
  • Порядок срабатывания EventListenerList
  • Печать большого компонента Swing
  • Как правильно использовать собственные средства визуализации для рисования конкретных ячеек в JTable?
  • Удалить контейнер верхнего уровня во время выполнения
  • Давайте будем гением компьютера.