フレームを折りたたむ(これは行う)だけでなく、親コンポーネント内でのJInternalFrameの位置を維持するために、JInternalFrameのアイコン化/最小化機能が必要です。現在、JInternalFrameの最小化ボタンを押すと、Javaはコンポーネントをコンテナーの下部に配置します。最小化しながら場所を維持する方法はありますか?明らかな解決策がない場合、アイコン化可能なアイコンを観察してデフォルトのリスナーを削除するにはどうすればよいですか?ありがとうございました。
2 に答える
この動作を変更するには、 の実装を作成する必要があります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);
}
});
}
}
念のために言っておきますが、アイコンの場所またはサイズを変更するだけの場合、それを実現する他の方法は、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タイプ)ごとに個別にルールを設定できます。ただし、一般的にすべてのJInternalFrameに影響を与えることが必要な場合は、Joshuaの推奨事項に従うことを強くお勧めします。