Эмулируйте эту оболочку SWT в Swing

Я столкнулся с SWT (использует GUI lib Eclipse), и я хочу создать следующее с помощью Swing.

введите здесь описание изображения

Предыдущий снимок экрана сделан с помощью следующего кода с использованием SWT.

public static void main(String[] args) {
    Display display = new Display();
    final Shell shell = new Shell(display, SWT.RESIZE);
    shell.open();
    while (!shell.isDisposed()) {
        if (!display.readAndDispatch())
            display.sleep();
    }
    display.dispose();
}

Мне было интересно, как я могу эмулировать это в Swing?

P.S. Граница вокруг этой оболочки в настоящее время является родной границей для моей цветовой схемы Windows, я не хочу просто создавать MatteBorder и эмулировать цвет, я хотел бы использовать родную границу для окон.


person Jonathan Beaudoin    schedule 18.07.2014    source источник
comment
Eclipse также использует SWT вместо Swing.   -  person MadProgrammer    schedule 18.07.2014
comment
Удалите декор JDialog, затем создайте свою собственную границу   -  person Dioxin    schedule 18.07.2014
comment
@VinceEmigh, да, это уже было предложено 25 минутами ранее. Вы хоть читали ответ?   -  person camickr    schedule 18.07.2014
comment
Другой способ — использовать JWindow. , который можно использовать для реализации виджета.   -  person nIcE cOw    schedule 18.07.2014
comment
@camickr Если бы я этого не сделал, я бы опубликовал это как ответ. Я разместил комментарий, чтобы сообщить ему, как это делается на Java, видя, как он не одобрил ваш ответ; предложенный вами способ - не единственный способ создать границу. Кроме того, я предлагаю указать на тот факт, что это невозможно динамически использовать в JDialog, поэтому он понимает, почему вы предложили то, что сделали.   -  person Dioxin    schedule 18.07.2014
comment
Я был бы в порядке без использования JDialog, просто нужно знать, какой тип компонента Swing может эмулировать тот же внешний вид.   -  person Jonathan Beaudoin    schedule 18.07.2014
comment
@JonathanBeaudoin, just need to know what type of swing component can emulate the same look - API Border, как уже было предложено. Нет границы LAF, которую вы можете просто подключить, вам нужно написать свою собственную, если вам не нравятся стандартные границы JDK.   -  person camickr    schedule 18.07.2014
comment
Если вы хотите, чтобы все выглядело как SWT, вы должны отметить, что это диалоговое окно SWT будет иметь совершенно разные границы на разных платформах (например, на Mac у него вообще нет границ).   -  person greg-449    schedule 23.07.2014


Ответы (3)


Итак, вопрос: можно ли создавать окна в нативном стиле с рамками только с помощью Swing?
Вкратце: Нет. К сожалению, это невозможно сделать с помощью Swing.< br> Также: То же самое «Нет» относится к окнам инструментов, которые также можно создавать с помощью SWT.

Теперь позвольте мне объяснить, почему.

Swing использует написанный на чистом Java рендеринг для рисования любых компонентов и пользовательских украшений в вашем приложении. Тем не менее, оформление окна в Swing немного отличается - по умолчанию JFrame и JDialog оформлены с использованием собственного стиля - в основном, когда экземпляр окна создается в вашей системе из приложения Java - этому окну предлагается иметь оформление по умолчанию для фрейма или диалога (плюс некоторые другие возможные варианты). После этого это окно используется для рендеринга на нем компонентов Swing. Но код Swing не имеет реального контроля над предоставляемым системой декором, он может только включать/выключать его и настраивать в нем несколько параметров. К сожалению, искомого варианта там нет - скорее всего, он не был реализован как не очень популярный.

Хотя Swing позволяет создавать пользовательские стили компонентов/окна с помощью пользовательских L&F (Look and Feel). L&F, который поддерживает пользовательские декорации окон, просто предоставляет свой собственный способ рисования и управления оформлением окон. В случае, если такой L&F установлен - Swing по умолчанию использует недекорированные фреймы/диалоги и просто просит L&F сделать декорирование. Любой может написать свой собственный L&F, что означает, что каждый может создавать собственные украшения.

Итак, как уже упоминалось @camickr, у вас есть только один вариант, если вы хотите создать такой фрейм (как на снимке экрана в вашем посте) в Swing - используйте либо JDialog/JFrame с setUndecorated, установленным в true, либо JWindow, который по умолчанию не декорирован, и «рисовать свой путь». Graphics2D, предусмотренный для всех операций рисования, позволит вам создать любое нестандартное оформление вашего окна, даже то, что на вашем скриншоте.

Не буду лгать - создавать нестандартное оформление окна довольно сложно - это требует больших знаний в Swing и большого количества написанного кода, а не только кода рисования. Так что я очень сомневаюсь, что вы выберете этот вариант, если вы не увлечены созданием пользовательского интерфейса.

В конце концов, вам придется выбирать между SWT и Swing (или даже JavaFX), поскольку каждая из этих инфраструктур пользовательского интерфейса предлагает совершенно разные наборы функций и опций. Оформление окон – это лишь верхушка большого айсберга.

РЕДАКТИРОВАТЬ: Поскольку JDK 7 фактически позволяет создавать окна инструментов, все, что вам нужно, это установить тип окна на Window.Type.UTILITY. Хотя по-прежнему невозможно создать окно с родными рамками только без заголовка.

person Mikle Garin    schedule 23.07.2014

Используйте undecorated JDialog. Затем вы можете добавить MatteBorder в корневую область диалогового окна. . Или вы всегда можете реализовать свою собственную границу для эмуляции границы LAF.

person camickr    schedule 18.07.2014
comment
Это не то, что я пытаюсь сделать. Я хочу добавить границу LAF снаружи, как в обычных окнах. - person Jonathan Beaudoin; 18.07.2014
comment
@JonathanBeaudoin, есть разница между тем, что вы хотите, и тем, что вы можете сделать. То, что вы хотите, это не поддержка. Я предложил альтернативу. - person camickr; 18.07.2014

В Eclipse я почти уверен, что это делается с помощью org.eclipse.swt.widgets.Shell с SWT.Border в качестве стиля. Я не могу придумать, как это сделать в Swing. Вы могли бы написать его самостоятельно, но в нем не было бы системы LAF.

Если это действительно важно, я бы предложил вместо этого использовать SWT, но это может потребовать перезаписи. В противном случае вы можете использовать SWT Shell с Swing компоненты, встроенные в него, но, по моему опыту, это очень неудобно и трудно отлаживать.

person George    schedule 18.07.2014
comment
Помимо встраивания Swing в SWT, вы также можете попробовать нарисовать его самостоятельно, вот так, но без заголовка и кнопок: Frosted Glass на рабочем столе Java™. Как я уже сказал, я не думаю, что Swing может сделать это из коробки. - person George; 18.07.2014