当前位置: 首页 > 知识库问答 >
问题:

JDesktopPane不会隐藏它的框架

林修真
2023-03-14

我想隐藏我的JDesktopPane在按钮的触发器中。但这不会隐藏自己。我创建了一个静态的空格方法,它隐藏了框架,并在action中调用它。我需要运行另一个EDT来隐藏我的帧吗?任何提示将不胜感激。

import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;

public class JDesktoppane extends JFrame
{
JDesktopPane desktop;
JMenu menu;

public JDesktoppane()
{
   super("TITLE");
   int inset = 80;
   Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

   setBounds(inset, inset,
           screenSize.width - inset*2,
           screenSize.height - inset*2);

    //Set up the GUI
   desktop = new JDesktopPane();
   //Setting JDesktopPane as Container
   setContentPane(desktop);
   setJMenuBar(createMenuBar());
   //Make dragging a little faster but perhaps uglier.
   desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
}

public JMenuBar createMenuBar()
{
    JMenuBar bar = new JMenuBar();

    menu = new JMenu("CLICK ME");

    JMenuItem item = new JMenuItem("CLICK ME AGAIN");
    item.addActionListener(listener);
    menu.add(item);

    bar.add(menu);


    return bar;
}

ActionListener listener = new ActionListener() 
{
    @Override
    public void actionPerformed(ActionEvent e) 
    {
        createFrame();
    }
};

public void createFrame()
{
    InternalFrame frame = new InternalFrame();
    frame.setVisible(true);
    desktop.add(frame);
}

public static void createAndShowGUI()
{
    JDesktoppane p = new JDesktoppane();
    p.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    p.setVisible(true);
}

public static void hideGUI()
{
    JDesktoppane p = new JDesktoppane();
    p.setVisible(false);
}

public static void main(String[] args) 
{
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            createAndShowGUI();
        }
    });
}

}

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;

public class InternalFrame extends JInternalFrame
{
public InternalFrame()
{
    addComponentsToPane(getContentPane());
    pack();
}

ActionListener listener = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) 
    {
        JDesktoppane.hideGUI();
    }
};

private void addComponentsToPane(final Container pane)
{
    JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());
    JButton btn = new JButton("HIDE ME");
    btn.addActionListener(listener);
    panel.add(btn);
    pane.add(panel);
}
}

共有1个答案

百里雅珺
2023-03-14

hideGUI中,您将创建一个新窗口,然后将其隐藏:

public static void hideGUI()
{
    // creating a new window
    JDesktoppane p = new JDesktoppane();
    p.setVisible(false);
}

我认为您的意思是,以某种方式为InternalFrame提供对您在createAndShowGUI中创建的原始窗口的引用。

你可以这样做:

public class InternalFrame extends JInternalFrame
{
    JDesktoppane parent;

    public InternalFrame(JDesktoppane parent)
    {
        this.parent = parent;

        addComponentsToPane(getContentPane());
        pack();
    }

    ActionListener listener = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) 
        {
            // note
            parent.setVisible(false);
        }
    };
    ...
}

和:

public void createFrame()
{
    //                                      vvvv
    InternalFrame frame = new InternalFrame(this);
    frame.setVisible(true);
    desktop.add(frame);
}

不过,内部窗格有一个隐藏其父窗格的按钮有点奇怪。更惯用的方法是有一个JMenuBar或类似的带有选项的东西。(你有把窗户拿回来的计划吗?通常如果你想隐藏一个窗口,你只需最小化它。)

 类似资料:
  • 我在隐藏状态栏时遇到了一些麻烦。 如果我使用此代码进入完全沉浸式模式(隐藏状态栏和导航),它确实会隐藏导航,但状态栏仍保持在那里: 我也尝试过使用清单: 两者都不管用。还尝试了不使用setSysteMivis()函数的清单方法(只是为了测试它是否可以工作——应该是这样的,因为我以前用过这个),但没有。 在Android 4.4.2(索尼z2平板电脑)和Android L-Dev预览版(第二版,Ne

  • 问题:如果距离为空/null,我试图隐藏一个值。 我尝试了以下操作,但该值仍在显示: 和 什么是实现我所期待的正确方法。 以下是我在coldfusion中定义距离的方式: 当我做以下建议时: ng-show="e.distance===未定义" 当我执行其他建议时,例如ng hide=“e.distance”, 以下是提供商包含的内容:

  • 本文向大家介绍ThinkPHP框架里隐藏index.php,包括了ThinkPHP框架里隐藏index.php的使用技巧和注意事项,需要的朋友参考一下 本文所写的配置在ThinkPHP3.2.2上测试过。按理也兼容其它版本。 首先修改配置文件: 'URL_CASE_INSENSITIVE' => true, // 默认false 表示URL区分大小写 true则表示不区分大小写 'URL_MODE

  • 问题内容: 我正在尝试使用灯箱时禁用父级的html / body滚动条。这里的主要词是 disable 。我也 没有 想隐藏它。 这样做的原因是使站点跳转并占据了滚动条所在的区域。 我想知道是否有可能在仍然显示它的同时禁用滚动条。 问题答案: 如果覆盖层下的页面可以在顶部“固定”,则在打开覆盖层时可以设置 您仍应看到右侧的滚动条,但内容不可滚动。当您关闭叠加层时,只需还原这些属性即可 我之所以这样

  • 有没有办法在另一个程序中隐藏窗口或框架?例如,如果你打开了一个Firefox窗口,并且运行了你的程序,那么它会和firefoxFrame一样。setVisible(false),但很明显,我没有对另一个程序框架的引用。然后也许以后,firefoxFrame。setVisible(真)

  • 问题内容: 我想使用MUI Grid,并且如果屏幕很小,我想隐藏一项Grid,所以我找到了一个名为Display的东西。我的代码看起来像这样 我不理解为什么它不起作用(文本仍然出现)。不能将显示与Grid一起使用吗?如果是,那为什么呢? 问题答案: 该风格的功能都不会自动支持组件。 利用样式功能的最简单方法是使用Box组件。该组件使所有样式功能(例如display)都可用。所述组件具有组件道具(默