2012-04-29 101 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來顯示此信息,則不必更改模型的基本邏輯結構。