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);
}
}
11 回答
如果你想制作窗口模态,最好的办法是使用JDialog而不是JFrame . 查看details on the introduction of the Modality API in Java 6了解相关信息 . 还有a tutorial .
下面是一些示例代码,它将在
JDialog
中显示JPanel panel
,它是Frame parentFrame
的模态 . 除了构造函数之外,它遵循与打开JFrame
相同的模式 .编辑:更新了Modality API链接并添加了教程链接(点头向@spork点头) .
您可以创建一个传递对父
JFrame
的引用的类,并将其保存在JFrame
变量中 . 然后,您可以锁定创建新框架的框架 .创建一个新的JPanel表单
将所需的组件和代码添加到其中
您的模态对话框等待...
在课堂上将
JFrame
替换为JDialog
然后在构造函数中编写
setModal(true);
之后,您将能够在netbeans中构建表单,表单将变为模态
据我所知,JFrame无法进行模态模式 . 请改用JDialog并调用setModalityType(Dialog.ModalityType type)将其设置为模态(或非模态) .
如果您准备使用JDialog而不是JFrame,则可以将 ModalityType 设置为 APPLICATION_MODAL .
这提供了与典型JOptionPane相同的行为:
这个静态实用程序方法也通过秘密打开模态JDialog来显示模态JFrame . 我在Windows 7,8和10-with-multiple-desktops上成功地使用了这个并且具有适当的行为 .
对于很少使用的本地类功能,这是一个很好的例子 .
有一些代码可能会有所帮助:
我在这种情况下所做的是,在我希望保持可见的主jframe中(例如,菜单框),我在属性窗口中取消选择
focusableWindowState
选项,这样它将是FALSE
. 一旦完成,我调用的jframe不会失去焦点,直到我关闭它们 .不确定你的JFrame的比赛,如果你问用户的一些输入,你可以使用JOptionPane,这也可以将JFrame设置为模态
最简单的方法是在可视化JFrame对象之前使用pack()方法 . 这是一个例子: