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

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

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

【问题讨论】:

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

标签: java swing joptionpane


【解决方案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(...)
猜你喜欢
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 2016-12-10
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
相关资源
最近更新 更多