【问题标题】:Closing Swing modal popups关闭 Swing 模式弹出窗口
【发布时间】:2015-05-29 14:20:36
【问题描述】:

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

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 之前:

做完之后:

【问题讨论】:

标签: java swing popup modal-dialog


【解决方案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.
        }));
    }
}

【讨论】:

  • 非常感谢,WebPopup.getParent().setVisible(false) 完成了这项工作,Popup 和灰色层现在都被隐藏了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多