2012-04-29 47 views
1

我有MyJPanel(扩展JPanel)。每个MyJPanel对象都有方法GetID()。当我创建它时,我使用构造函数设置ID(但也有方法SetID()),设置大小,然后创建Jscrollpane并将其添加到JInternalFrame。所有帧都在ArrayList<JInternalFrame> arr从JInternalframe的内容获取方法

JInternalFrame frame = new JInternalFrame("Inner frame",true,true,true,true); 
final MyJPanel panel = new MyJPanel(f.getAbsolutePath(),count); 
panel.setSize(panel.getWidth()/6,panel.getHeight()/6); 
JScrollPane pane = new JScrollPane(panel); 
pane.setPreferredSize(new Dimension(theDesktop.getWidth()/2, theDesktop.getHeight()/2)); 
frame.getContentPane().add(pane, BorderLayout.CENTER); 

要删除帧我想补充添加的FrameListener和方法internalFrameClosing方法

public void internalFrameClosing(InternalFrameEvent e) { 
     int index = panel.GetID();//get index of panel окна 
     if (index == arr.size()) 
      arr.remove(index);//remove last element 
     else{ 
      //reset all indexes of JInternalFrames' MyJPanel 
     } 
} 

但我不知道什么时候帧中的一个被删除,因为 如何重置为JInternalFrames的阵列MyJPanels值1)MyJPanel在JScrollPane中。方法SetID 2)JScrollPane在JInternalFrame中 3)JInternalFrame在数组中。没有方法SetID()在arr.get(i)

回答

2

一个简单的解决方案是拥有一个Map,例如HashMap - HashMap<JInternalFrame, MyJPanel> - 这将允许您轻松地将MyJPanel与保存它的内部框架关联。然后当你遍历JInternalFrames时,很容易找到每个拥有的MyJPanels。

喜欢的东西:

public void internalFrameClosing(InternalFrameEvent e) { 
    int index = panel.GetID(); 
    arr.remove(index); 
    if (index < arr.size()) { 
    for (int i = 0; i < arr.size(); i++) { 
     JInternalFrame internalFrame = arr.get(i); 
     MyJPanel myPanel = framePanelMap.get(internalFrame); 
     myPanel.setID(i); 
    } 
    } 
} 

顺便说一句,你知道这if (index == arr.size())永远是正确的,因为如果你的索引是一个索引列表,那么指数将保持在0和arr.size() - 1和意志之间的值。从来没有== arr.size()

虽然这有点混杂。在我看来,更好的解决方案可能是进行代码重新设计,并将代码的模型逻辑与代码的视图部分分开,以便您拥有模型的ArrayList而不是JInternalFrame。

这样,如果稍后您决定不想使用JInternalFrame来显示此信息,则不必更改模型的基本逻辑结构。