【问题标题】:Minimize a resizable JDialog最小化可调整大小的 JDialog
【发布时间】:2020-06-30 14:20:49
【问题描述】:

我正在开发一个带有主窗口(扩展JFrame)的摇摆应用程序,可以从中打开几个子窗口(目前超过 1 个)。
这些窗口都是非模态的并且可以调整大小。
到目前为止,我将这些“子”窗口实现为JFrame。但是,对于每个打开的窗口,我的 Windows 任务栏上都会出现一个新图标。
因此,我尝试将这些窗口实现为 JDialog,类型为 ModalityType.MODELESS
看起来不错,只是 JDialog 没有最小化按钮。

有没有办法解决这个问题?
即,我需要创建可以最小化的非模态和可调整大小的子窗口。
JInternalFrame 不是一个选项,因为主框架不仅仅是一个带有JDesktopPane 的容器,子窗口应该能够交叉主窗口的边框。

对于那些感兴趣的人:
子窗口在打开/关闭时在主窗口上注册和取消注册。
主窗口有一个带有“Windows”项目的菜单,并且在注册/注销时从该菜单中添加/删除子窗口。
用户可以通过在此菜单中选择一个项目在各个窗口之间切换。

【问题讨论】:

  • 最小化后会去哪里?或者,为什么不直接使用关闭按钮?
  • 当最小化它应该被简单地隐藏。重新激活时(通过选择主窗口中的相应菜单项),应显示原始内容。子窗口可能很大,可能完全覆盖主窗口。这就是为什么我需要它们最小化。
  • 好的,我知道您需要将它们最小化,但您的最小化听起来与关闭它们相同。那么为什么不直接使用关闭按钮呢?
  • 关闭子窗口时,其内容(可能已被用户编辑)丢失。我不想要那个。而且我不想仅仅因为他想在另一个窗口中查看,就强迫用户保存或重新开始。
  • 只是在关闭的时候不丢失窗口的内容?当他们单击关闭时,隐藏窗口,仅此而已。另外,您可能想检查一下。 stackoverflow.com/questions/2054347/…

标签: swing java-8 jdialog


【解决方案1】:

我提出两个建议。

  • A.不要使用关闭按钮来删除内容。
  • 乙。将子 jframe 的类型设置为实用程序。

我认为让 JDialog 关闭按钮销毁数据会使您的用户为数据丢失做好准备。我会改为使用关闭来隐藏窗口,然后在对话框内设置控件来取消/完成/重新启动。

import java.awt.*;

public class DiFrame{
    static JDialog log;
    static JFrame ame;
    public static void main(String[] args){
        JFrame frame = new JFrame("Father of two");
        
        JButton one  = new JButton("dialog");
        
        one.addActionListener( evt->{
            if(log==null){
                log = new JDialog(frame, "dialog child", false);
                log.add(new JTextArea("fresh start"));
                log.pack();
                log.setVisible(true);
            } else{
                log.setVisible(true);
            }
        });
        
        JButton two = new JButton("frame");
        
        two.addActionListener( evt->{
            if(ame==null){
                ame = new JFrame("frame child");
                ame.add( new JTextArea("fresh start") );
                ame.setType(Window.Type.UTILITY);
                ame.pack();
                ame.setVisible(true);
            } else{
                ame.setVisible(true);
            }
        });
        frame.add(one, BorderLayout.NORTH);
        frame.add(two, BorderLayout.SOUTH);

        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

  
}

单击对话框按钮,它会显示对话框。然后可以修改文本区域。对话框关闭后可以重新打开。

单击框架按钮,将显示一个 jframe。 (我实际上无法检查这是否显示为新应用程序,因为它不在我的计算机上。)

【讨论】:

  • 将框架设置为“实用程序”会使其标题栏变小。不是一个选择。在 windowClosing 事件中将它们实现为 JDialog 和 setVisible(false)。单独的“关闭”按钮,用于处理窗口。这不是一个真正的解决方案,但我猜是最好的解决方法。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
相关资源
最近更新 更多