从JInternalframe的内容中获取方法

时间:2012-04-29 13:34:19

标签: java swing jpanel jinternalframe

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

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在数组中。 arr.get(i)中没有方法SetID()。

1 个答案:

答案 0 :(得分:2)

一个简单的解决方案是使用一个地图,例如HashMap - HashMap<JInternalFrame, MyJPanel> - 这将允许您轻松地将MyJPanel与包含它的内部框架相关联。然后当你遍历JInternalFrames时,很容易检索每个持有的MyJPanel。

类似的东西:

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而不是JInternalFrame。

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