2011-12-05 6 views
0

JpanelにはJInternalFrameの一部があります。 JPanelはgridlayoutです。コンテナ内でJInternalFrameを1つだけ選択する必要があります(JPanel)。 JInternalFrameインスタンスを動的に作成し、パネルに追加しました。私はまだJInternalFrameのリストを持っていますが、1つだけを選択して選択する方法はあります。コンテナ内の複数のJInternalFrameの選択(JPanel)

答えて

3

How to Use Internal Framesで示唆されているように、「通常、デスクトップペインに内部フレームを追加します。これにより、activateFrame()を使用して、フレームにフォーカスがあることを示すことができます。このexampleでは、メニューからsetSelected()を介してフレームを選択するのにjavax.swing.Actionが使用されます。追加の議論は、Q&Aにあります。

補足:JPanelを使用する場合は、恐らくGridLayoutを入手するには、次のようにInternalFrameListenerを使用します。

enter image description here

import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.beans.PropertyVetoException; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JInternalFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.event.InternalFrameAdapter; 
import javax.swing.event.InternalFrameEvent; 

/** @see https://stackoverflow.com/questions/8389640 */ 
public class InternalGrid extends JPanel { 

    private final List<MyFrame> list = new ArrayList<MyFrame>(); 

    public InternalGrid() { 
     super(new GridLayout(2, 2)); 
     for (int i = 0; i < 4; i++) { 
      MyFrame f = new MyFrame("Frame", i); 
      list.add(f); 
      this.add(f); 
     } 
    } 

    private void display() { 
     JFrame f = new JFrame("InternalGrid"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setSize(320, 240); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new InternalGrid().display(); 
      } 
     }); 
    } 

    class MyFrame extends JInternalFrame { 

     MyFrame(String name, int i) { 
      super(name + String.valueOf(i), true, true, true, false); 
      this.pack(); 
      this.setVisible(true); 
      this.setLayout(new FlowLayout()); 
      this.add(new JLabel("Hi, I'm " + this.getTitle())); 
      this.addInternalFrameListener(new InternalFrameAdapter() { 

       @Override 
       public void internalFrameActivated(InternalFrameEvent e) { 
        for (MyFrame f : list) { 
         if (f != MyFrame.this) { 
          try { 
           f.setSelected(false); 
          } catch (PropertyVetoException ex) { 
           System.out.println(ex); 
          } 
         } 
        } 
       } 
      }); 
     } 
    } 
} 
+0

ウル返事をUに感謝しかし、私はここでのJPanelで使用する状況があります。しかし、 – Pratap

+1

ゴミ箱は正しいです。親JPanelをJDesktopPaneで置き換えるか、他に誰も使用していないケースがあります。すべてのJInternalFrameをそれ自身のJDesktopPaneに配置し、選択変更プロセスで以前に選択したものを配置することができます。 –

+0

@Joopは良い点を挙げています。例えば、 'iconifiable'はデスクトップペインの外では無意味になります。コードと画像が更新されました。 – trashgod