首页 文章

如何在Swing java中创建JFrame模型

提问于
浏览
57

我创建了一个GUI,其中我使用了JFrame . 我应该如何制作模态?

11 回答

  • 1

    如果你想制作窗口模态,最好的办法是使用JDialog而不是JFrame . 查看details on the introduction of the Modality API in Java 6了解相关信息 . 还有a tutorial .

    下面是一些示例代码,它将在 JDialog 中显示 JPanel panel ,它是 Frame parentFrame 的模态 . 除了构造函数之外,它遵循与打开 JFrame 相同的模式 .

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

    编辑:更新了Modality API链接并添加了教程链接(点头向@spork点头) .

  • 6

    您可以创建一个传递对父 JFrame 的引用的类,并将其保存在 JFrame 变量中 . 然后,您可以锁定创建新框架的框架 .

    parentFrame.disable();
    
    //Some actions
    
    parentFrame.enable();
    
  • -2
    • 创建一个新的JPanel表单

    • 将所需的组件和代码添加到其中


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

    您的模态对话框等待...

  • 0

    在课堂上将 JFrame 替换为 JDialog

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

    然后在构造函数中编写 setModal(true);

    之后,您将能够在netbeans中构建表单,表单将变为模态

  • 6

    据我所知,JFrame无法进行模态模式 . 请改用JDialog并调用setModalityType(Dialog.ModalityType type)将其设置为模态(或非模态) .

  • 58

    如果您准备使用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

    这个静态实用程序方法也通过秘密打开模态JDialog来显示模态JFrame . 我在Windows 7,8和10-with-multiple-desktops上成功地使用了这个并且具有适当的行为 .

    对于很少使用的本地类功能,这是一个很好的例子 .

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

    有一些代码可能会有所帮助:

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

    我在这种情况下所做的是,在我希望保持可见的主jframe中(例如,菜单框),我在属性窗口中取消选择 focusableWindowState 选项,这样它将是 FALSE . 一旦完成,我调用的jframe不会失去焦点,直到我关闭它们 .

  • 4

    不确定你的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");
                }
    
  • -2

    最简单的方法是在可视化JFrame对象之前使用pack()方法 . 这是一个例子:

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

相关问题