打开另一个窗口时如何使JFrame变黑

6
我希望我的主JFrame在焦点在另一个窗口时变暗。这是来自游戏Football Manager 2012的示例。首先选择主窗口并且它看起来应该是这样的,然后当它正在加载时,它会变暗和不可选择。我想在自己的应用程序上使用这些效果,但我不太确定如何做,甚至不确定该搜索什么? 我猜这是一个出现的JWindow,而JFram在后台变得不可选择。我计划在我的应用程序中使用它作为帮助窗口,目前是一个JWindow。

1
也许你在谈论Lightbox效果。如果是的话,那么这个链接可以帮到你:http://harryjoy.wordpress.com/2011/08/07/lightbox-jar/。 - Harry Joy
2个回答

9

Andrew Thompson的想法是正确的,只是使用框架的JRootPane玻璃板功能更容易。以下是一些可工作的代码:在您的框架类中,调用

getRootPane().setGlassPane(new JComponent() {
    public void paintComponent(Graphics g) {
        g.setColor(new Color(0, 0, 0, 100));
        g.fillRect(0, 0, getWidth(), getHeight());
        super.paintComponent(g);
    }
});

然后,要显示“curtain”,请调用
getRootPane().getGlassPane().setVisible(true);

在上面的代码中,将alpha透明度值100更改为找到合适的暗度。

..希望在新窗口关闭后JFrame恢复正常。我尝试使用setVisible(false),但它没有起作用。

在这个例子中它是有效的。

Shadowed Frame

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class ShadowedFrame extends JFrame {

    ShadowedFrame() {
        super("Shadowed Frame");
        getRootPane().setGlassPane(new JComponent() {
            public void paintComponent(Graphics g) {
                g.setColor(new Color(0, 0, 0, 100));
                g.fillRect(0, 0, getWidth(), getHeight());
                super.paintComponent(g);
            }
        });
        JButton popDialog = new JButton("Block Frame");
        popDialog.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                getRootPane().getGlassPane().setVisible(true);
                JOptionPane.showMessageDialog(ShadowedFrame.this, "Shady!");
                getRootPane().getGlassPane().setVisible(false);
            }
        });
        setContentPane(popDialog);
        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationByPlatform(true);
        setSize(350,180);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new ShadowedFrame().setVisible(true);
            }
        });
    }
}

谢谢,它运行得很好,但是我希望在新窗口关闭后JFrame能够恢复正常。我尝试了setVisible(false)但是没有起作用。 - Handsken
更轻量级的说法是,JOptionPane.showMessageDialog(ShadowedFrame.this, "Shady!"); 可以是对另一个扩展了 JDialog 的类的引用吗? - Handsken
1
@Handsken 是的,您可以显示任何派生自JDialog的模态对话框,而不是显示JOptionPane - Ingo Kegel
@AndrewThompson,我最新遇到的问题是我有太多信息要在“弹出窗口”中显示,而只能将其添加在一行JOptionPane.showMessageDialog(ShadowedFrame.this, "All my info here");。所以我想知道是否可以这样做 - getRootPane().getGlassPane().setVisible(true); Class c = new Class(); getRootPane().getGlassPane().setVisible(false); 因为我无法让它工作? - Handsken
1
@Handsken 你不能吗?无论如何,这听起来像是一个单独的问题,你应该发布自己的(损坏的)代码SSCCE。它不必像我发布的那个那么简短,但要删除任何不必要的内容以使其崩溃。哦,我们可能不需要任何截图,尽管它们很漂亮。;) - Andrew Thompson
显示剩余4条评论

4
(未经测试,但是…)似乎使用JLayeredPane是一个不错的选择。创建一个设置为透明的JComponent并将其添加到分层窗格的顶层。在组件的paintComponent(Graphics)方法中,设置半透明颜色并用其填充整个区域。在正常使用时(非变暗状态下),调用customComponent.setVisible(false)

更新

或者,如Ingo所指出的那样,使用玻璃板。

我猜它是一个JWindow出现,而JFrame在后台变得无法选取。

更可能是模态JDialog。当模态对话框可见时,作为所有者的框架/窗口将变得无法访问(无法被点击)。

谢谢!我把我的JWindows改成了JDialogs,效果好多了! :) - Handsken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接