0

こんにちは、デフォルトの最小/最大ボタンと復元ボタンを備えた内部フレームがほとんどありません。デフォルト状態の場合は正常に動作しますが、メイン フレームを復元すると正しく動作しません。2 つの内部フレームが最小状態にあり、1 つが最大状態にあるとします。メインコンテナを最大化すると、すべての最小内部フレームが消えます>以下のコードを見つけてください。添付のスクリーンショットを見つけてください

package tryout;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;

import javax.swing.*;

public class Test3 {

    public static void main(String[] args) {
        new Test3();
    }

    private int xpos = 0;
    private int ypos = 0;

    public Test3() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception exp) {
                    exp.printStackTrace();
                }
                DesktopPane pane = new DesktopPane();
                pane.add(newInternalFrame());
                pane.add(newInternalFrame());
                pane.add(newInternalFrame());

                JFrame frame = new JFrame();
                frame.add(pane);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(400, 400);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

            }
        });
    }

    public JInternalFrame newInternalFrame() {
        JInternalFrame inf = new JInternalFrame("Blah", true, false, true, true);
        inf.setLocation(xpos, ypos);
        inf.setSize(100, 100);
        inf.setVisible(true);
inf.repaint();
inf.revalidate();
        xpos += 50;
        ypos += 50;

        return inf;
    }

    public class DesktopPane extends JDesktopPane {

        @Override
        public void doLayout() {
            super.doLayout();
            List<Component> icons = new ArrayList<Component>(25);
            int maxLayer = 0;

            for (Component comp : getComponents()) {
                if (comp instanceof JInternalFrame.JDesktopIcon) {
                    icons.add(comp);
                    maxLayer = Math.max(getLayer(comp), maxLayer);
                }
            }

            maxLayer++;
            int x = 0;
            for (Component icon : icons) {

                int y = getHeight() - icon.getHeight();
                icon.setLocation(x, y);
                x += icon.getWidth();
                setLayer(icon, maxLayer);

            }
        }
     /*   public void doLayout() {
            super.doLayout();
            List<Component> icons = new ArrayList<Component>(25);
            for (Component comp : getComponents()) {
                if (comp instanceof JInternalFrame.JDesktopIcon) {
                    icons.add(comp);
                }
            }

            int x = 0;
            for (Component icon : icons) {

                int y = getHeight() - icon.getHeight();
                icon.setLocation(x, y);
                x += icon.getWidth();

            }
        }*/
    }
}
4

1 に答える 1

0

これは解決策というよりハックです。

なぜそうなるのかはわかりませんが、何らかの理由でデスクトップ ペインのサイズを変更すると、他のすべてのコンポーネント (およびレイヤ プロパティ) に関係なく、最大化されたウィンドウが前面に表示されるように見えます。

これにより、デスクトップ ペインがレイヤー プロパティを優先するようになったようです。

public class DesktopPane extends JDesktopPane {

    public DesktopPane() {
        addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                revalidate();
                repaint();
            }
        });
    }

    /*...*/

}
于 2013-02-18T04:02:04.570 に答える