Включение JFrame в черный цвет при открытии другого окна - PullRequest
5 голосов
/ 08 ноября 2011

Я не хочу, чтобы мой основной JFrame становился темнее, когда фокус находится на другом окне. Это пример из игры Football Manager 2012. Сначала выбирается главное окно, и оно выглядит так, как должно, затем, когда оно загружается, оно становится темнее и недоступно для выбора. Я не хочу, чтобы это влияло на мое собственное приложение, но я не совсем уверен, как, даже не знаю, что гуглить?

Я предполагаю, что это JWindow, которое появляется, и JFram становится невыбираемым в фоновом режиме. Я планирую использовать его в окне справки в моем приложении, это сейчас JWindow.

enter image description here enter image description here

Ответы [ 2 ]

8 голосов
/ 08 ноября 2011

Эндрю Томпсон имеет правильную идею, только проще использовать функцию стеклянной панели 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);

В приведенном выше коде измените значение альфа-прозрачности на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);
            }
        });
    }
}
4 голосов
/ 08 ноября 2011

(не проверено, но ..) Похоже, хорошая задача для JLayeredPane.Создайте прозрачный JComponent и добавьте его на верхний уровень многоуровневой панели.В методе компонента paintComponent(Graphics) установите полупрозрачный цвет и заполните им всю площадь.При обычном использовании (без затемнения) звоните customComponent.setVisible(false).

Обновление

Или, как указал Инго, используйте стеклянную панель.

I 'Я угадываю, что появляется JWindow, а JFrame становится недоступным для выбора на заднем плане

Скорее всего, это модал JDialog.Когда модальное диалоговое окно является видимым, рамка / окно, которое является владельцем, становится недоступным (не может быть нажата).

...