2011-12-05 27 views

回答

3

正如How to Use Internal Frames所述,「通常,您將內部框架添加到桌面窗格。」這使您可以使用activateFrame()來指示幀具有焦點。在此example中,javax.swing.Action用於通過setSelected()從菜單中選擇幀。其他討論可以在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

感謝ü烏拉圭回合的答覆,但我有一種情況,一個JPanel這裏使用。 – Pratap

+1

垃圾是正確的;或者用JDesktopPane替換父JPanel,或者您沒有其他人使用的情況。您可以開始將每個JInternalFrame放置在其自己的JDesktopPane中,並在選擇更改時處理先前選擇的JInternalFrame。 –

+0

@Joop提供了一個很好的觀點。例如,'iconifiable'在桌面窗格之外變得毫無意義。代碼和圖片已更新。 – trashgod