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 
     } 
} 

Но я не знаю, как сбросить значения MyJPanels в массиве JInternalFrames, когда один из кадров был удален из-за 1) MyJPanel находится в JScrollPane. метод 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); 
    } 
    } 
} 

Кстати, вы знаете, что это if (index == arr.size()) никогда не будет верно, так как если ваш индекс является индексом в списке, то индекс будет содержать значение от 0 до arr.size() - 1 и будет никогда == arr.size().

Хотя это что-то вроде kludge. На мой взгляд, лучшее решение, возможно, состоит в том, чтобы сделать повторный дизайн кода и иметь модельную логику вашего кода отдельно от части представления кода, чтобы у вас был бы ArrayList моделей, а не JInternalFrames.

Таким образом, если позже вы решите, что не хотите использовать JInternalFrames для отображения этой информации, вам не придется менять основную логическую структуру модели.

Смежные вопросы