it-swarm.com.ru

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

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

58
om.

Лучше всего использовать JDialog вместо JFrame, если вы хотите сделать окно модальным. Проверьте подробности о введении Modality 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);

Правка: обновлена ​​ссылка на Modality API и добавлена ​​ссылка на учебник (кивок на @spork для увеличения). 

59
akf

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

parentFrame.disable();

//Some actions

parentFrame.enable();
15
Kamil

просто замените JFrame на JDialog в классе

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

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

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

7
Ivan
  1. Создать новую форму JPanel
  2. Добавьте нужные компоненты и код к нему

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


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

6
Richard Kenneth Niescior

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

4
NawaMan

Если вы готовы использовать 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();
}
}
1
Stephen Paul

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

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

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
Dreamspace President

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

0
Johan Rincon

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

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
The Codartofonist