没有标题栏或关闭按钮的 JOptionPane 内部对话框?

Posted

技术标签:

【中文标题】没有标题栏或关闭按钮的 JOptionPane 内部对话框?【英文标题】:JOptionPane Internal Dialog without title bar or close button? 【发布时间】:2013-12-05 11:32:36 【问题描述】:

我正在开发一款游戏作为练习项目。首次加载时,会提示用户登录或创建新播放器。如果用户选择创建一个新玩家,我想要显示新玩家创建表单(主游戏板是JDesktopPane,理想情况下,它会在JPanel它的顶层),其他一切都会暂停,直到用户填写并提交此表单。

由于游戏中的其他用户输入任务是使用JOptionPane.showInternalOptionDialog 完成的,我认为这可能会完成这项工作,因为我正在寻找一个类似于模式对话框的JPanel。但是,我想要没有标题栏或关闭button 的东西,只有确定和取消按钮。有没有办法在没有这些的情况下显示内部对话框?或者以其他方式让JPanel 像模态对话框一样工作?

【问题讨论】:

您可以利用 JXLayer 显示 here、here 和 here 来阻止主 UI,并利用框架玻璃窗格或分层窗格向您展示 @ 987654331@。这将“锁定”基本 UI 并允许您在其上浮动组件 查看How to use Root Panes了解更多详情... 【参考方案1】:

您可以使用 JDialog 类

这是一个例子,试着从中得到启发:

import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class BDialog extends JDialog 

    private JButton okBtn = new JButton("OK");
    private JButton cancelBtn = new JButton("Cancel");
    private JLabel messageLbl = new JLabel("This is a message");

    public BDialog() 
        super(new JFrame(), true);
        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        setUndecorated(true);
        setLayout(new FlowLayout(FlowLayout.CENTER));
        add(messageLbl);
        add(okBtn);
        add(cancelBtn);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    

    public static void main(String[] args) 
        new BDialog();
    


如果这可以帮助您解决问题,请

【讨论】:

这种东西可以在内部对话中使用吗?如果是这样,那可能就是我要找的。​​span> 当然这就是我为你写它的原因。它需要一个小的修改才能作为一个对话框很好地工作。如果您需要更多帮助,请问我^^ 好的,还有一个问题。如果我将其中之一用作模式对话框,它会阻止后台运行的 SwingWorker 线程吗? 您能否展示一个示例,说明如何在 JDesktopPane 的内部对话框中调用一个?它需要在 JOptionPane 或 JInternalFrame 中吗?【参考方案2】:

只需使用JFrame 并使用setUndecorated 方法

JFrame myFrame = new JFrame("My Frame");
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)       
myFrame.setBounds(10, 10, 300, 100);
myFrame.setUndecorated(true);

然后你可以添加一个面板来保存按钮

【讨论】:

改为模态对话框 不要使用设置边界。框架应打包,以便根据添加到对话框中的组件调整大小。您可能还想使用setLocationRelativeTo(...) 方法来定位对话框。 感谢@camickr,我一直以为setBounds 是用来指定框架的大小并放置它的。不是这样(为什么)?如果没有,什么时候应该使用这个功能? 它可以使用,但是有更好的API供您使用,您不必编造幻数。应根据添加到框架的组件的首选尺寸对框架进行包装,以使框架具有适当的尺寸。然后在框架的情况下,您将使用setLocationByPlatform() 让操作系统确定在哪里显示框架。在弹出对话框的情况下,您可能希望它相对于现有框架居中,因此您可以使用setLocationRelativeTo(...)

以上是关于没有标题栏或关闭按钮的 JOptionPane 内部对话框?的主要内容,如果未能解决你的问题,请参考以下文章

无按钮上的JOptionPane关闭框架[重复]

java中,swing设计中,为啥JOptionPane.showmessageDialog()弹出对话框后,单击确定按钮能关闭窗口?

Android WebView 不显示标题栏或浮动按钮

如何让弹出对话框JOptionPane.showConfirmDialog在不用点击"确定"的情况下,可以在给定时间内自动关闭呢?

使 JOptionPane 消息对话框在渲染后消失

QML - 通过点击事件显示菜单栏或菜单项