【问题标题】:JInternal Frame Over JPanelJPanel 上的内部框架
【发布时间】:2014-11-28 05:19:00
【问题描述】:

我在 JPanel 的区域内的 JInternalFrame 中需要一些帮助。我有一个 JFrame,其中包含 当我单击其中一个菜单项时,JPanel 添加到其 ContentPane.JFrame 包含菜单 需要在内容窗格顶部添加 JInternal Frame。到目前为止我给出的代码,

    JDesktopPane desktop = new JDesktopPane();
    desktop.setLayout(new BorderLayout());

    JPanel topPanel = new JPanel();
    GridBagLayout gbl_contentPane = new GridBagLayout();
    gbl_contentPane.columnWidths = new int[] { 0, 0, 0, 0 };
    gbl_contentPane.rowHeights = new int[] { 0, 0, 0, 0 };
    gbl_contentPane.columnWeights = new double[] { 1.0, 6.0, 1.0,
            Double.MIN_VALUE };
    gbl_contentPane.rowWeights = new double[] { 0.0, 8.0, 0.0,
            Double.MIN_VALUE };
    topPanel.setLayout(gbl_contentPane);

    JPanel left = new JPanel();
    GridBagConstraints gbc_left = new GridBagConstraints();
    gbc_left.insets = new Insets(0, 0, 5, 5);
    gbc_left.fill = GridBagConstraints.BOTH;
    gbc_left.gridx = 0;
    gbc_left.gridy = 1;
    topPanel.add(left, gbc_left);

    JPanel middle = new JPanel();
    GridBagLayout gbl_middle = new GridBagLayout();
    gbl_middle.columnWeights = new double[] { 1.0 };
    middle.setLayout(gbl_middle);
    GridBagConstraints gbc_middle = new GridBagConstraints();
    gbc_middle.insets = new Insets(0, 0, 5, 5);
    gbc_middle.fill = GridBagConstraints.BOTH;
    gbc_middle.gridx = 1;
    gbc_middle.gridy = 1;
    topPanel.add(middle, gbc_middle);

    GridBagConstraints gbc = new GridBagConstraints();
    JPanel panel1 = new JPanel();
    Border eBorder = BorderFactory.createEtchedBorder();
    panel1.setBorder(BorderFactory.createTitledBorder(eBorder, "70pct"));
    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.fill = GridBagConstraints.BOTH;
    gbc.weightx = gbc.weighty = 30;
    middle.add(panel1, gbc);
    panel1.setLayout(new MigLayout("", "[944.00,grow][353.00]",
            "[6.00][128.00,grow][]"));

    /*lblHeader = new JLabel(
            "<html>Indira Institute of Technology<br>Tatabad<br>Karpagam Complex Stop<br>Coimbatre</html>");
    lblHeader.setIcon(new ImageIcon(
            "C:\\Users\\Prakash\\Desktop\\images.jpg"));
    panel1.add(lblHeader, "cell 0 1 2 1,alignx center,aligny center");*/

    JPanel panel2 = new JPanel();
    gbc = new GridBagConstraints();
    panel2.setBorder(BorderFactory.createTitledBorder(eBorder, "30pct"));
    gbc.gridy = 1;
    gbc.gridwidth = gbc.gridheight = 1;
    gbc.fill = GridBagConstraints.BOTH;
    gbc.anchor = GridBagConstraints.NORTHWEST;
    gbc.weightx = gbc.weighty = 70;
    gbc.insets = new Insets(2, 2, 2, 2);
    middle.add(panel2, gbc);
    panel2.setLayout(new MigLayout(
            "",
            "[30px][69.00px][144.00][68.00][][159.00px][59.00px][65px][28.00][]",
            "[20px:n,grow 50,shrink 50][20px:n,grow 50,shrink 50][20px:n,grow 50,shrink 50][20px:n,grow 50,shrink 50][30.00][48.00:n,grow 50,shrink 50]"));

    getContentPane.add(topPanel);

我从来没有在这个中使用过DesktopPane(我不知道在这种情况下如何使用它)并且屏幕到目前为止如下,

现在我需要为上一个屏幕添加 JInternalFrame,如下所示,

我知道我只能将 JInternalFrame 添加到 DesktopPane。但是我 已经用 JPanel 填充了我的 ContentPane 以显示其内容。我怎样才能实现 Jinternal 本JFrame中待添加的框架,请多提宝贵意见。

【问题讨论】:

    标签: java swing jinternalframe


    【解决方案1】:

    不是真正正确的方向。你原来的面板在布局管理器的控制下,这意味着当你添加JInternalFrame到它时,布局管理器想要尝试布局它。

    一般来说,JInternalFrame 想要驻留在不受管理的容器中,从而使其能够独立于内容进行定位和调整大小。

    一个可能的解决方案可能是利用 JInternalFrame 的玻璃窗格来代替,有关更多详细信息,请参阅 How to Use Root Panes

    另一种解决方案可能是使用JLayeredPane。基本上,您首先将JLayeredPane 的布局管理器设置为链接BorderLayout,将第一个面板添加到其中,然后在其上方添加第二个没有布局的透明窗格。您可以将JInternalFrames 添加到第二个面板中。

    详情请见How to Use Layered Panes

    我突然想到的问题是……为什么?你为什么不直接使用某种对话框呢?详情请见How to Make Dialogs

    【讨论】:

    • 是的,我可以使用对话框。但如果它是一个对话框,它将完全控制焦点。我们不能最小化它,我们不能打开它的另一个实例。对吧?那么为什么我我选择 JinternalFrame。
    • 从技术上讲,您应该能够创建任意数量的应用程序实例,假设您的意思是创建一个新的 JVM 实例。你可以设置一个非模态对话框,但是你必须问为什么?你想达到什么目的。对话框是从用户那里获取快速信息的好方法,然后可以将其关闭...
    • 对不起。我不是指应用程序的实例。我真正需要的是,考虑我需要在单击菜单项时打开注册表单。如果我使用对话框,我可以一次只打开一个注册表单。不是吗?但我需要的是用户可以打开任意数量的登录屏幕。他在打开另一个屏幕之前没有完整的一个屏幕。这就是我正在工作的情况.请指引我正确的方向。
    • 首先查看The Use of Multiple JFrames, Good/Bad Practice?,您可以将对话框的可变性限制为单帧(从内存中),有关详细信息,请参阅How to Make DialogsHow to Use Modality in Dialogs
    【解决方案2】:

    你真正想要的是什么?

    您写道,您已经将内容窗格添加到框架中。 JDesktopPane 必须保留自己的空间。如果您没有或不想为主框架中的内部框架保留空间,那么您可能甚至不希望它成为主框架的一部分。在这种情况下,您可能希望使用子 JDialogs 而不是 JInternalFrames。

    因此,要么将您的JDesktopPane 添加到您的主框架(保留其空间),要么使用子JDialogs,它可以是模态的,也可以不是模态的,并且可以与主框架的任何部分重叠。 JInternalFrames 仅在 JDesktopPane 区域可见,而子 JDialogs 可以“浮动”在您的主框架上。

    查看此 Oracle 文档:How to Use Internal Frames

    还有How to Make Dialogs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 2013-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多