1

まず、GlassPane を表示してから、それに JInternalFrame を追加します。GlassPane は、その下の GUI 要素へのアクセスを正常にブロックしますが、JInternalFrame のサイズを変更しようとすると、GlassPane が消えてしまい、その理由がわかりません。

内部フレームはその上に静止しています。何かが Glasspane の setVisible メソッドを false に変更しているようです... どうすれば修正できますか?

ここにいくつかのコードがあります。JInternalFrame のサイズを変更すると、glassPane が表示されなくなります。

import java.awt.Cursor;
import java.awt.event.*;
import java.beans.PropertyVetoException;
import javax.swing.*;
import javax.swing.event.*;

public class Example {

    private static JFrame frame = new JFrame();
    private static JDesktopPane glassPane = new JDesktopPane();

    public static void main(String[] args) {
        // make JDesktopPane (glassPane) transparent
        glassPane.setOpaque(false);
        // add empty mouse adapter to block events to other components then JInternalFrame
        glassPane.addMouseListener(new MouseAdapter(){});
        frame.setGlassPane(glassPane);

        final JInternalFrame internal = new JInternalFrame("testFrame", true, true);
        internal.setBounds(20, 20, 240, 200);

        // add listener to hide glassPane when  intenralFrame is closed
        internal.addInternalFrameListener(new InternalFrameListener(){
            public void internalFrameOpened(InternalFrameEvent e) {}
            public void internalFrameClosing(InternalFrameEvent e) {}
            public void internalFrameClosed(InternalFrameEvent e) {
                glassPane.remove(internal);
                glassPane.setVisible(false);
                glassPane.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
                try {
                    internal.setClosed(true);
                } catch (PropertyVetoException e1) {
                    e1.printStackTrace();
                }           
            }
            public void internalFrameIconified(InternalFrameEvent e) {}
            public void internalFrameDeiconified(InternalFrameEvent e) {}
            public void internalFrameActivated(InternalFrameEvent e) {}
            public void internalFrameDeactivated(InternalFrameEvent e) {}

        });

        // adding exmaple components to frame
        frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.PAGE_AXIS));
        frame.getContentPane().add(new JButton("button 1"));
        // button showing modal JInternalFrame
        JButton activate = new JButton("Show Modal InternalFrame");
        activate.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                glassPane.add(internal);    
                internal.setVisible(true);
                glassPane.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
                glassPane.setVisible(true);
            }       
        });
        frame.getContentPane().add(activate);

        // example menu
        JMenuBar menuBar = new JMenuBar();
        JMenu menu = new JMenu("test menu");
        menu.add(new JMenuItem("test"));
        menuBar.add(menu);
        frame.setJMenuBar(menuBar);
        frame.setSize(800, 600);
        frame.setVisible(true);
    }
}
4

0 に答える 0