2012-04-29 2 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 
     } 
} 

를 추가 추가 프레임을 삭제하려면하지만 프레임 중 하나가 때문에 삭제 된 경우 한 JInternalFrame의 배열 MyJPanels 값을 다시 설정하는 방법을 모른다 1) MyJPanel은 JScrollPane에 있습니다. method SetID 2) JScrollPane가 JInternalFrame에있는 경우 3) JInternalFrame이 배열에 있습니다. SetID() 메서드는 arr.get(i)에 없습니다.

답변

2

간단한 해결책은 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); 
    } 
    } 
} 

, 당신은 당신의 색인 목록의 인덱스 인 경우, 다음 인덱스는 0 arr.size() - 1과 의지 사이의 값을 유지하기 때문에이 if (index == arr.size())이 사실 결코 것이라는 점을 알고있다 결코 == arr.size().

다소 다소 진흙이지만. 제 생각에는 더 좋은 해결책은 코드 재 설계를하고 코드의 모델 논리를 코드의 뷰 부분과 분리하여 JInternalFrames보다는 Model의 ArrayList를 갖도록하는 것입니다.

이 방법으로 나중에 JInternalFrames를 사용하여이 정보를 표시하지 않으려는 경우 모델의 기본 논리 구조를 변경할 필요가 없습니다.