【问题标题】:Turning a JFrame black when opening another window打开另一个窗口时将 JFrame 变为黑色
【发布时间】:2011-12-24 07:22:09
【问题描述】:

当焦点在另一个窗口上时,我不想让我的主 JFrame 变暗。 这是游戏 Football Manager 2012 中的一个示例。首先选择了主窗口,看起来应该是这样,然后在加载时,它会变暗并且无法选择。我不想对我自己的应用程序产生这种影响,但我不确定如何,甚至不确定要谷歌什么?

我猜它出现了一个 JWindow,并且 JFram 在后台变得无法选择。我打算在我的应用程序的帮助窗口中使用它,现在就是一个 JWindow。

【问题讨论】:

  • 可能你在谈论灯箱效果。如果是,那么this 可以帮助您。

标签: java swing user-interface awt jframe


【解决方案1】:

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);
    }
});

然后,为了展示“幕布”,调用

getRootPane().getGlassPane().setVisible(true);

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


.. 新窗口关闭后 JFrame 不能恢复正常。我试过 setVisible(false) 但没用。

在这个例子中有效。

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),但没用。
  • 这就像我想要的那样工作!谢谢。是否可以使 JDialog 成为外部类,我想在其中有一些选项,例如在对话框中选择框架的颜色?
  • 或者更精简,JOptionPane.showMessageDialog(ShadowedFrame.this, "Shady!"); 可以引用另一个类,它扩展了 JDialog?
  • @Handsken 是的,您可以显示从JDialog 派生的任何模式对话框,而不是显示JOptionPane
  • @Handsken 你不能吗?无论如何,这听起来像是一个单独的问题,您应该在其上发布自己的(损坏的)代码SSCCE。它不必像我发布的那样短,但剪掉任何不需要看到它破裂的东西。哦,我们可能不需要任何屏幕截图,就像它们一样漂亮。 ;)
【解决方案2】:

(未经测试,但是..)对于JLayeredPane 来说似乎是一项不错的任务。创建一个设置为透明的JComponent 并将其添加到分层窗格的顶层。在组件的paintComponent(Graphics) 方法中,设置半透明颜色并用它填充整个区域。正常使用(非调光),请致电customComponent.setVisible(false)

更新

或者,正如 Ingo 指出的那样,使用玻璃窗格。

我猜它出现了 JWindow,而 JFrame 在后台变得无法选择

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

【讨论】:

  • 谢谢!我将我的 JWindows 切换到 JDialogs,效果更好! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多