2011-08-02 12 views
2

JInternalFrameのアイコン化可能/最小化機能を使用してフレームを折りたたむだけでなく、親コンポーネント内でJInternalFrameの位置を維持する必要があります。現在、JInternalFrameのminimizeボタンを押すと、コンポーネントのコンテナの下部にコンポーネントが配置されます。最小限に抑えながら場所を維持する方法はありますか?明白な解決策がない場合、どのように私はiconableアイコンを観察し、デフォルトのリスナーを削除することができますか?ありがとうございました。JInternalFrameは現在の位置を維持しながら最小化します

答えて

4

この動作を変更するには、javax.swing.DesktopManagerの実装を作成するとよいでしょう。既に利用可能な既定の動作の大部分を取得するには、javax.swing.DefaultDesktopManagerのサブクラス化をお勧めします。

DefaultDesktopManagerでは、メソッドiconifyFrame(JInternalFrame f)は完全な動作を制御しますが、内部的にはメソッドprotected Rectangle getBoundsForIconOf(JInternalFrame f)を使用して、最小化されるフレームのアイコンの境界を決定します。ここでは、使用したい内部フレームのアイコンの境界を返すことができます。問題はそれらの値がキャッシュされているので、次のようなことをする必要があるたびに移動したい場合です。念のため

import javax.swing.DefaultDesktopManager; 
import javax.swing.DesktopManager; 
import javax.swing.JDesktopPane; 
import javax.swing.JFrame; 
import javax.swing.JInternalFrame; 
import javax.swing.SwingUtilities; 
import java.awt.BorderLayout; 
import java.awt.Dimension; 

public class CustomDesktopManager extends DefaultDesktopManager { 
    @Override 
    public void iconifyFrame(JInternalFrame f) { 
     super.iconifyFrame(f); 

     JInternalFrame.JDesktopIcon icon = f.getDesktopIcon(); 
     Dimension prefSize = icon.getPreferredSize(); 
     icon.setBounds(f.getX(), f.getY(), prefSize.width, prefSize.height); 
    } 

    public static void main(String args[]) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       JDesktopPane desktopPane = new JDesktopPane(); 
       DesktopManager dm = new CustomDesktopManager(); 
       desktopPane.setDesktopManager(dm); 
       JInternalFrame internalFrame = new JInternalFrame("Test Internal Frame", true, false, true, true); 
       internalFrame.setSize(200, 150); 
       internalFrame.setVisible(true); 
       desktopPane.add(internalFrame); 

       frame.add(desktopPane, BorderLayout.CENTER); 
       frame.setSize(800, 600); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

あなたは私の人生の時間を節約しました。ありがとうございました。 –

0

、もしあなたは、単にそれがあなたのJInternalFrameのinternalFrameIconified()イベントを通じてで実現するために、アイコンの位置やサイズ、他の方法を変更されて欲しいもの:

public void internalFrameIconified(javax.swing.event.InternalFrameEvent evt) { 
    JInternalFrame.JDesktopIcon icon = myInternalFrame.getDesktopIcon(); 
    icon.setSize(new Dimension(200,icon.getSize().height)); //Change icon width to 200 
    icon.setLocation(x,y); //You can calculate its position as you wish (not implemented here).  
} 

この方法DefaultDesktopManagerを拡張することなく、各JInternalFrame(またはJInternalFrameタイプ)に対して独立してルールを設定できます。しかし、あなたが望むものが一般にすべてのJInternalFramesに影響を与えることであれば、Joshuaの推奨に従うことを強くお勧めします。

関連する問題