1

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);

フレームを削除するには、AddFrameListenerとメソッド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
       }
}

しかし、1)MyJPanelがJScrollPaneにあるため、フレームの1つが削除されたときに、JInternalFramesの配列内のMyJPanelsの値をリセットする方法がわかりません。メソッドSetID2)JScrollPaneはJInternalFrameにあります3)JInternalFrameは配列にあります。にメソッドSetID()はありませんarr.get(i)

4

1 に答える 1

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()

これはやや面倒ですが。私の考えでは、より良い解決策は、コードの再設計を行い、コードのモデル ロジックをコードのビュー部分から分離して、JInternalFrames ではなくモデルの ArrayList を持つようにすることです。

このようにすると、後で JInternalFrames を使用してこの情報を表示する必要がないと判断した場合でも、モデルの基本的な論理構造を変更する必要はありません。

于 2012-04-29T13:39:55.683 に答える