java新建jframe_如何在Swing java中创建JFrame模型

本文提供了一系列示例代码,展示了如何在Java Swing中创建模态JFrame或使用JDialog实现模态效果。从简单的JDialog设置到复杂的模态窗口管理,包括JOptionPane、JDialog的模态类型设置以及自定义窗口关闭监听器等,帮助开发者理解并实现Java窗口的模态交互。
摘要由CSDN通过智能技术生成

回答(11)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

下面是一些示例代码,它将在 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点头) .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

parentFrame.disable();

//Some actions

parentFrame.enable();

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

创建一个新的JPanel表单

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

YourJPanelForm stuff = new YourJPanelForm();

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

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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

在课堂上将 JFrame 替换为 JDialog

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

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

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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

}

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

这个静态实用程序方法也通过秘密打开模态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.

*

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

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

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

}

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

myFrame frm = new myFrame();

frm.pack();

frm.setVisible(true);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值