JDesktopPane 不会隐藏它的框架
JDesktopPane won't hide it's frame
我想在按钮触发器中隐藏我的 JDesktopPane
。但这不会隐藏自己。我创建了一个隐藏框架的静态 void 方法,并在 actionPerformed 中调用它。我需要 运行 另一个 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);
}
}
在 hideGUI
中,您正在创建一个新的 window 然后隐藏它:
public static void hideGUI()
{
// creating a new window
JDesktoppane p = new JDesktoppane();
p.setVisible(false);
}
我想你的意思是以某种方式给 InternalFrame
一个你在 createAndShowGUI
.
中创建的原始 window 的引用
你可以这样做:
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 或类似的带有选项的东西。 (你有计划让 window 回来吗?通常如果你想隐藏 window,你只需将它最小化即可。)
我想在按钮触发器中隐藏我的 JDesktopPane
。但这不会隐藏自己。我创建了一个隐藏框架的静态 void 方法,并在 actionPerformed 中调用它。我需要 运行 另一个 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);
}
}
在 hideGUI
中,您正在创建一个新的 window 然后隐藏它:
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 或类似的带有选项的东西。 (你有计划让 window 回来吗?通常如果你想隐藏 window,你只需将它最小化即可。)