Как сделать все окна аэро стекла на Java? - PullRequest
4 голосов
/ 16 ноября 2009

Я пытаюсь запрограммировать небольшое приложение, но мне бы хотелось, чтобы все окно было стеклянным с кнопками и надписями поверх него. Возможно ли сделать это в Java?

Ответы [ 3 ]

8 голосов
/ 16 ноября 2009

Предполагая, что Java SWT и друзья не имеют встроенной поддержки технологии Windows Aero, вам придется вызывать собственный API через JNI. API, который вам нужно вызвать, это

DwmExtendFrameIntoClientArea(int windowHandle, MARGINS margins);

Этот собственный API находится в собственной библиотеке DWMAPI.dll в Windows Vista и Windows 7 и задокументирован в MSDN .

В Интернете много документации о том, как вызывать эту функцию. Например, вот статья о , делающая это в C # . Это должно начать вас.

4 голосов
/ 12 декабря 2011

Конечно, эта функция сильно зависит от платформы (в данном случае Windows), поэтому необходим JNI.

Предположим, вы уже проверили, включены ли стеклянные окна. Шаги:

  1. убедитесь, что окно является слоистым;
  2. расширить стеклянную рамку в клиентской зоне;
  3. выберите цвет, который идентифицирует прозрачные области;
  4. установить этот цвет в качестве фона окна.

Шаги 1-3 написаны на C. Пусть HWND hwnd дескриптор окна, которое вы хотите застеклить, и пусть COLORREF color цвет (более необычный, лучший):

// 1.
SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
SetWindowPos(hwnd, NULL, 0, 0, 0, 0,
  SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
// 2.
MARGINS margins = {-1, -1, -1, -1};
DwmExtendFrameIntoClientArea(hwnd, &margins);
// 3.
SetLayeredWindowAttributes(hwnd, color, 0, LWA_COLORKEY);

Шаг 4 - простая Java, что-то вроде

window.getContentPane().setBackground(color);

где color - версия Java выбранного ранее цвета.

0 голосов
/ 16 ноября 2009

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

Попробуйте создать JFrame и установить его цвет фона на new Color(255, 255, 255, 20) или около того, где 20 - это альфа. Это должно либо сделать его в основном прозрачным, либо не будет работать.

...