关闭Swing模式弹出窗口

时间:2015-05-29 14:20:37

标签: java swing popup modal-dialog

当我试图隐藏或关闭作为模态调用的弹出对话框时,组件会按原样消失,但是指示窗口模态的灰色屏幕仍然可见,直到此窗口区域的第一次鼠标单击事件。

WebPopup darkenScreen = new WebPopup(PopupStyle.gray);
ContructPopUP(darkenScreen);
darkenScreen.showPopupAsModal(this);

弹出设置方法:

private void ContructPopUP(WebPopup darkenScreen)
{
    final JFrame mFrame = this;
    final WebTextField inputTime = new WebTextField("(sekundy)");
    darkenScreen.setLayout(new GridLayout(3, 1));
    darkenScreen.add(new WebLabel("Podaj czas : "));
    darkenScreen.add(inputTime);
    darkenScreen.add(new WebButton(new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            int secTime = Integer.parseInt(inputTime.getText());
            if (secTime > 0 && secTime < 7200)
            {
                Connection.TurnOff(secTime);
                System.out.println("clicked!");
            }

            darkenScreen.hidePopup();
        }
    }));
}

当作为普通弹出窗口调用时,一切都会以缩进方式消失。我试图以多种方式关闭它,但它们都没有起作用。

在点击按钮并执行popup.hide之前: Before popup.hide()

之后:

after

1 个答案:

答案 0 :(得分:1)

假设您使用的是WebLaF library,我认为您的问题可能是由PopupLayer.hidePopup方法引起的。此方法由WebPopup.hidePopup方法调用,并应隐藏模态弹出窗口,但正如您所注意到的,灰色层不会消失。如果您查看PopupLayer.hideAllPopups,则会在此方法中删除所有弹出窗口,并且弹出图层将不可见。我没有WebLaF库的经验,感觉很乱,但你可以通过自己隐藏弹出层来解决问题:

import com.alee.laf.button.WebButton;
import com.alee.laf.label.WebLabel;
import com.alee.laf.text.WebTextField;
import com.alee.managers.popup.PopupStyle;
import com.alee.managers.popup.WebPopup;

import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class ModalWebPopup {
    public static void main(final String[] arguments) {
        new ModalWebPopup().launchGui();
    }

    private void launchGui() {
        final JFrame frame = new JFrame("Stack Overflow: modal WebPopup");
        frame.setBounds(100, 100, 800, 600);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        final JPanel panel = new JPanel();
        final JButton button1 = new JButton("Show a modal WebPopup");
        panel.add(button1);
        frame.getContentPane().add(panel);

        button1.addActionListener(actionEvent -> {
            final WebPopup darkenScreen = new WebPopup(PopupStyle.gray);
            constructPopup(darkenScreen);
            darkenScreen.showPopupAsModal(frame);
        });

        frame.setVisible(true);
    }

    private void constructPopup(final WebPopup darkenScreen) {
        //final JFrame mFrame = this;
        final WebTextField inputTime = new WebTextField("(sekundy)");
        darkenScreen.setLayout(new GridLayout(3, 1));
        darkenScreen.add(new WebLabel("Podaj czas : "));
        darkenScreen.add(inputTime);
        darkenScreen.add(new WebButton(actionEvent -> {
            int secTime = Integer.parseInt(inputTime.getText());
            if (secTime > 0 && secTime < 7200) {
                //Connection.TurnOff(secTime);
                System.out.println("clicked!");
            }

            System.out.print("Hide the modal WebPopup ");

            // Normal way to hide the popup:
            //darkenScreen.hidePopup();

            System.out.println("by making the parent of the WebPopup invisible.");

            // Alternative way to hide the popup:
            darkenScreen.getParent().setVisible(false);

            // Compare the PopupLayer.hideAllPopups and PopupLayer.hidePopup methods
            // for more details.
        }));
    }
}