我有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()。
答案 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来显示此信息,则不必更改模型的基本逻辑结构。