Java - старый прозрачный JFrame, без ограничений - PullRequest
5 голосов
/ 04 октября 2011

Да, этот вопрос везде.Но все (рабочие) решения используют набор инструментов AWTUtilities, который ограничен.

Итак.Я просто хочу контролировать прозрачность моего окна.Не нужно придавать форму или не украшать.Просто прозрачная панель содержимого (легкая) и прозрачный фон JFrame (смехотворно трудный).

Я мог бы поклясться, что вчера получил правильную комбинацию вещей, но теперь я не могу воспроизвести ее.Также есть некоторые решения без использования AWTUtilities, но они не работают ... У кого-нибудь есть хорошее решение?

Пример моего ошибочного кода:

public static void main(String[] args) {
    JFrame test = new JFrame();
    test.setSize(400, 400);
    test.setLocationRelativeTo(null);
    test.setUndecorated(true);
    test.setBackground(new Color(0, 0, 0, 0));
    test.getContentPane().setBackground(new Color(0,0,0,0));
    test.setVisible(true);
}

, ноэто просто делает белый квадрат.Близко, но не сигара.Я также попытался переопределить метод рисования, и кто-то говорил что-то о выбросе альфа-канала, но это сделало его черным (конечно).Итак ... Это переполнение стека.

Если есть дупель, который точно отвечает на этот вопрос, пожалуйста, укажите мне, и я немедленно удалю.

Обновление Согласно запросам в комментариях, вот история того, как я сюда попал:

Первая ссылка, на которую все приходят, это как создавать полупрозрачные и фасонные окна. Здесь есть несколько строк, похожих на "... рамка прозрачная с уровнем непрозрачности 75%. "Итак ... похоже, что они определены одинаково, по крайней мере, в этой статье.К сожалению, они используют библиотеку.

Несколько ссылок, которые я мог бы найти:

Неработающее "рабочее" решение сообщается по адресу http://www.java -gaming.org / index.php? topic = 24635.0 , которая показывает некоторую надежду, но я не мог заставить ее работать.

http://techgearup.wordpress.com/2008/09/19/transparent-jframe-background/ - это хакерский способ, использующий скриншоты и дублированный в нескольких других местах.

Ответы [ 2 ]

1 голос
/ 04 октября 2011

Вы не можете сделать это без использования Java v.6u10 + или сторонних библиотек, которые вызывают собственный код.В Swing Frames диалоги и Windows считаются «компонентами верхнего уровня» и отображаются в базовой оконной системе.До Java v6u10 все компоненты верхнего уровня имели непрозрачный светло-сероватый фон по умолчанию, и не было никакого способа изменить это из кода Java.

0 голосов
/ 28 февраля 2012

Вздох Я столкнулся с той же проблемой, и после долгого времени, работая над ней, я нашел способ получить правильно установленный прозрачный экран на моем компьютере.Однако многие вещи перестают работать, как только вы устанавливаете прозрачную рамку.Если вы где-нибудь используете декларацию JTextArea, она немедленно перестает работать.Он даже не выдаст ошибку!

Итак, вот код, надеюсь, он вам пригодится.Пожалуйста, ответьте, если вы сделаете рабочую JScrollPane с ним:)

public class gui {
    public frame f;
    public String name = "Transparent?"; //name your frame *
    public JButton exit = new JButton("Exit");
    public gui(){ //non-static context
        f = new  JFrame(name);
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); //*
        f.setLocationRelativeTo(null);
        f.setExtendedState(f.getExtendedState() | JFrame.MAXIMIZED_BOTH);
        //maximizes window. if you dont want it, f.setSize(int, int)
        f.setUndecorated(true); //necessary for setOpacity
        f.setOpacity(.7f); //achieve trasparancy
        f.setVisible(true); //show window
        exit.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent arg0){
                System.exit(0);
            }
        });
        f.add(exit, BorderLayout.CENTER); 
        //since X is not available in the window, make a button to exit
    }

    public static void main(){
        new gui();
    }
}
//* Note: since the default Window manager is set off with setUndecorated(true),
// the name and buttons won't really show. 
...