我创建了一个带有多个 JInternalFrames 的 Swing 应用程序,当鼠标单击时,这些 JInternalFrames 会被添加到 JDesktopPane 中。我只希望 DesktopPane 上出现相同内部框架的一个实例。当用户打开框架时,我不希望同一个框架出现两次..
6 回答
解决您的问题的简单方法是创建一个HashMap<String,JInternalFrame>
. 将是key
它的标题,JInternalFrame
也是当前打开的那个。当第一次打开内部框架时,保存( ) 对。禁用所有窗口的关闭按钮,使用户无法处理显示的窗口。将键注册到每个对象,以便当按下键盘按钮时,当前显示在 .Now上最小化。现在当您单击打开相同的内部框架时,检查 是否存在于其中。如果存在,则检索该value
object
JInternalframe
key,value
HashMap
JInternalFrame
JInternalFrame
esc
JInternalFrame
esc
JInternalFrame
DesktopPane
menu item
title
JInternalFrame
HashMap
key
value
key
并通过变量引用它JInternalFrame
,然后在DesktopPane
. 如果title
that 中不存在对应的条目,则HashMap
创建一个新JInternalFrame
对象,在 中为相同的条目创建HasMap
并显示它。
注意:我在此处发布的任何内容都是针对以下情况的解决方案:您可以拥有多种类型,
JInternalFrame
每种类型都具有独特的不同functionality
,并且您只想保留其中instance
的一种JInternalFrame
。
这是可能的示例代码。希望这有帮助。在 JdesktopPane 所在的主应用程序中调用内部框架的菜单操作。
private void YourJinternalFrameMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
YourJinternalFrame nw = YourJinternalFrame.getInstance();
nw.pack();
//usefull part for you.. if open shows, if not creates new one
if (nw.isVisible()) {
} else {
desktopPane.add(nw);
nw.setVisible(true);
}
try {
nw.setMaximum(true);
} catch (PropertyVetoException ex) {
Logger.getLogger(MainApplication.class.getName()).log(Level.SEVERE, null, ex);
}
}
把它放在你的 YourJinternalFrame 里面
private static YourJinternalFrame myInstance;
public static YourJinternalFrame getInstance() {
if (myInstance == null) {
myInstance = new YourJinternalFrame();
}
return myInstance;
试试这个简单的代码:
YourJinternalFrame nw = new YourJinternalFrame();
private void YourJinternalFrameMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
if(!nw.isVisible()){
YourJDesktopPane.add(nw);
nw.setVisible(true);
}
}
试试这个简单的代码,将类变量 chk 设置为 0,然后调用 jframe 方法 componentremoved 在这个 set chk =0 再次,如果你调用你的内部框架 set chk =1 并在调用 internal 时比较 chk 无论它是零还是不是全部
我寻求了不同的解决方案:
final JInternalFrame[] frames = desktopPane.getAllFrames();
if( !Arrays.asList(frames).contains(loginFrame) ) {
loginFrame = new LoginFrame();
desktopPane.add(loginFrame);
loginFrame.setVisible(true);
}
这对我有用(检查类名):
final JInternalFrame[] frames = desktopPane.getAllFrames();
LoginFrame loginFrame = new LoginFrame();
if( !Arrays.asList(frames).toString().contains("LoginFrame") ) {
desktopPane.add(loginFrame);
loginFrame.setVisible(true);
loginFrame.validate();
}