我创建了一个包含多个JInternalFrame的Swing应用程序,在单击鼠标时会将其添加到JDesktopPane。我想只需要在DesktopPane上显示相同内部框架的一个实例。当用户打开框架时,我不希望同一帧出现两次..
答案 0 :(得分:2)
问题的简单解决方案是创建HashMap<String,JInternalFrame>
。 key
将是JInternalFrame
的标题,value
将是当前打开的object
的{{1}}。保存(JInternalframe
)第一次打开内部框架时在key,value
中配对。禁用所有HashMap
窗口的关闭按钮,以便用户无法处置显示的JInternalFrame
窗口。向每个JInternalFrame
对象注册esc
键,以便在按下键盘的JInternalFrame
按钮时,esc
上的当前显示JInternalFrame
最小化。现在当你点击DesktopPane
打开相同的内部框架,检查menu item
中title
的{{1}}是否存在JInternalFrame
HashMap
。如果它存在,则检索key
的{{1}}并通过value
变量引用它,然后在key
上恢复它。如果JInternalFrame
中不存在DesktopPane
的相应条目,请创建一个新的title
对象,在HashMap
中为其创建一个条目并显示它。
注意:无论我在这里发布什么,都是针对这种情况的解决方案 你可以有许多类型的
JInternalFrame
,每个都有唯一的 不同的HasMap
,并且您只想保留一个JInternalFrame
每个functionality
。
答案 1 :(得分:2)
以下是示例代码。希望这个帮助。 在主应用程序中调用内部框架的菜单操作,其中包含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;
答案 2 :(得分:1)
试试这个简单的代码:
YourJinternalFrame nw = new YourJinternalFrame();
private void YourJinternalFrameMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
if(!nw.isVisible()){
YourJDesktopPane.add(nw);
nw.setVisible(true);
}
}
答案 3 :(得分:0)
试试这个简单的代码 取类变量chk并设置为0 然后调用jframe方法 的componentRemoved 在这个集chk = 0再次 如果你调用你的内部框架集 chk = 1 并且在调用内部时比较chk它是否为零 多数民众赞成
答案 4 :(得分:0)
我选择了另一种解决方案:
final JInternalFrame[] frames = desktopPane.getAllFrames();
if( !Arrays.asList(frames).contains(loginFrame) ) {
loginFrame = new LoginFrame();
desktopPane.add(loginFrame);
loginFrame.setVisible(true);
}
答案 5 :(得分:0)
这对我有用(检查类名):
final JInternalFrame[] frames = desktopPane.getAllFrames();
LoginFrame loginFrame = new LoginFrame();
if( !Arrays.asList(frames).toString().contains("LoginFrame") ) {
desktopPane.add(loginFrame);
loginFrame.setVisible(true);
loginFrame.validate();
}