2

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

4

2 に答える 2

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);
            }
        });
    }
}
于 2011-08-02T18:04:13.687 に答える
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タイプ)ごとに個別にルールを設定できます。ただし、一般的にすべてのJInternalFrameに影響を与えることが必要な場合は、Joshuaの推奨事項に従うことを強くお勧めします。

于 2011-12-16T04:46:58.837 に答える