Как сделать панель прозрачной java

Обновлено: 03.07.2024

Если я переместу JScrollPane так, чтобы он был перед и частично закрывал JPanel, то JEditorPane внутри JScrollPane будет иметь проблемы с рисованием. Он неправильно перекрашивает фон JPanel. Таким образом, при прокрутке у вас возникают проблемы с рисованием на экране.

Я пробовал перекрытие, используя следующие методы - JScrollPane внутри JPanel - JScrollPane частично покрывает JPanel с использованием FreeLayout (NetBeans GUI Builder) - JScrollPane частично покрывает JPanel, используя JLayeredPane

У JPanel сейчас сплошной фон, но я увеличу его до градиента, как только у меня будет сплошной фон.

Как я могу заставить JEditorPane добавить обрезанный фон из JPanel?

Я делаю это прозрачным, используя jEditorPane.setBackground(new Color(0,0,0,0))

Я пытался использовать setOpaque(false) так же, как вы бы это делали для панели, но это просто возвращает фон по умолчанию, если вы это делаете в JEditorPane.

Я хочу создать полупрозрачную JPanel. Я сделал это, просто используя значение RGBA конструктора цвета, но проблема в том, когда я использую обработку событий не woking должным образом. Мое требование-полупрозрачная Jpanel, когда мышь входит в нее, граница этой панели стала видимой, и если мышь выходит из границы, shoud не виден. Я сделал это, следуя коду, но проблема в том, что он не работает должным образом для прозрачного backgroud (RGBA), но он хорошо работает для цвета RGB.

2 ответа

JPanel не поддерживает полупрозрачные фоны. Существует два шага, необходимых для решения этой проблемы:

Во-первых, чтобы иметь какую-либо правильно функционирующую прозрачность, вы должны setOpaque(false) на панели; в противном случае у вас будут глюки, потому что предполагается, что непрозрачная панель полностью покрывает то, что находится под ее границами.

Однако, когда opaque это false , панель также не рисует свой фон вообще (!) таким образом, вам придется нарисовать фон в paintComponent.

Вот drop-in класс замены, который будет заботиться о обоих этих шагов.

Я проверил, что он работает в вашей программе, если я изменю первое создание панели на:

Это легко сделать так:

x в этом случае это уровень прозрачности, который вы ищете
0 быть невидимым, 100 быть твердым.

Как мы все знаем, в окне Java по умолчанию используется системный стиль по умолчанию, так как же нам определить стиль, чтобы он выглядел лучше? Позвольте мне поделиться, как настроить стиль.


Эффект:

Сначала подготовим наш фон, карту кнопок:

Сначала создайте два объекта изображения и добавьте файл ресурса изображения.

Вы можете видеть, что мы используем относительный путь и путь относительно файла jar после экспорта нашего программного обеспечения. В eclipse ide папка bin в папке проекта может быть эквивалентна экспортированному нами файлу jar.


Затем нам нужно добавить картинку на задний план нашего окна следующим образом:

Но обнаружил, что наше окно не может быть перетащен. Теперь добавьте фрагмент кода для реализации перетаскивания:

Сначала определите две глобальные переменные в нашем классе как позицию мыши:

Затем добавьте следующий код в метод main:


Окно сделано.

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

Создать текст метки:

Обычно используют объект панели JPanel для объединения, структурирования и компоновки компонентов, а затем добавьте в окно следующим образом:

Но после запуска мы были разочарованы, обнаружив:


Это потому, что у JPanel также есть непрозрачный фон, который блокируется после добавления в окно. Всего одна строка кода, чтобы сделать панель прозрачной:

В первой версии языка Java для работы с графикой было только библиотека AWT. Эта библиотека – простой набор классов, таких, как Button(кнопка),TextField (текстовое поле), Label (текстовая метка или иконка) и другие.
Вскоре была создана более совершенная библиотека, которую назвали Swing. Она так же включает в себя кнопки,текстовые поля и другие элементы управления графическими приложениями. Названия компонентов этой библиотеке начинается с буквы J. Например JButton, JTextField и т.д.

Работать в Swing лучше, быстрей и удобней.

Вот некоторые основные объекты, из которых состоят Swing приложения:

Панель (panel) или, как ещё её называют, pane(оконное стекло) содержит все кнопки, текстовые поля, метки и другие компоненты.

Оконные элементы управления, такие как кнопки JButton,текстовые поля JTextfield,списки JList, и так далее.

Менеджер размещения (layout managers) компонент, которые помогают организовать все эти кнопки и поля на панели.

Например, можно создать экземпляр класса JPanel и назначить для него схему размещения. Затем создайте различные графические компоненты и добавьте их на панель. После этого добавьте панель на фрейм, задать его размер и сделать его видимым.

JFrame является главным окном для размещения компонентов и представляет их пользователю.

get/setLocation(int width,int height): Получить/установить месторасположение в окне, где фрейм должен появиться.

AWTUtilities.setWindowOpacity(JFrame frame, 0.5f); - Если добавить эту строку окно будет на половину прозрачным

Панель

Панель JPanel — это элемент управления, представляющий собой прямоугольное пространство, на котором можно размещать другие элементы. Элементы добавляются и удаляются методами, унаследованными от класса Container.

У каждой панели есть менеджер размещения, который определяет стратегию взаимного расположения элементов, добавляемых на панель. Его можно изменить методом setLayout(LayoutManager manager).

Оконные элементы управления

Класс JComponent

Все визуальные компоненты библиотеки Swing унаследованы от класса JComponent. Сам этот класс является абстрактными и непосредственно не используется, но все визуальные компоненты наследуют его методы.

Метка JLabel

В большинстве визуальных библиотек метка — один из самых простейших компонентов. Она представляет собой обычный текст, который выводится в заданном месте окна и используется для вывода вспомогательной текстовой информации: подписи к другим элементам, инструкции и предупреждения для пользователя.

JLabel(String text, Icon image, int align) — создает метку с надписью text и значком image. Третий параметр задает выравнивание текста вместе со значком. В качестве него может быть использована одна из констант, описанных в интерфейсе SwingConstants: LEFT, RIGHT, CENTER.

get/setIconTextGap(int gap) — позволяет получить или задать расстояние между текстом и значком метки в пикселах.

get/setVerticalAlignment(int align), get/setHorizontalAlignment(int align) — эти четыре метода позволяют получить текущее или установить новое выравнивание (по горизонтали и вертикали) метки относительно ее границ. Возможные положения описаны в интерфейсе SwingConstants.

get/setVerticalTextPosition(int align), get/setHorizontalTextPosition(int align) — эти четыре метода позволяют получить текущее или установить новое выравнивание текста относительно значка. Возможные положения описаны в интерфейсе SwingConstants.

Кнопка JButton

get/setRolloverIcon(Icon icon) - позволяет задать значок, который будет появляться при наведении на кнопку мыши.

get/setMargin(Insets margin) - позволяет задать величину отступов от текста надписи на кнопке до ее полей.

setFocusPainted(boolean focusPainted) - Включить/Выключить прорисовку фокуса (кнопка, на которой находится фокус, выделяется пунктирным прямоугольником).

Компоненты JToggleButton, JCheckBox, JRadioButton

Компонент JToggleButton представляет собой кнопку, которая может находиться в двух состояниях: нажатом и отпущенном.
Когда пользователь щелкает мышкой по такой кнопке, она изменяет свое состояние. Именно таким образом ведут себя кнопки форматирования на инструментальной панели текстового редактора. Кнопка [I] не только устанавливает или убирает курсивное начертание в выделенном тексте, но и сигнализирует о его наличии или отсутствии.

JToggleButton(String text, Icon icon, boolean selected) - Основной конструктор создает кнопку с заданными надписью, значком и текущим состоянием.

isSelected() возвращает true, если кнопка выбрана (т.е. находится в нажатом состоянии) и false в противном случает.

От класса JToggleButton унаследован класс JCheckBox — флажок.
Этот класс имеет точно такой же набор конструкторов и методов, т.е. не расширяет функциональность предка. Единственное различие между ними — во внешнем виде: JCheckBox выглядит не как кнопка, а как небольшой квадратик, в котором можно поставить или убрать галочку.

Аналогичным образом ведет себя класс JRadioButton — переключатель или радиокнопка, внешне выглядящая как пустой кружок, когда она не выделена и кружок с точкой в выделенном состоянии.

Для того, чтобы элементы объединить в группу, используется специальный контейнер ButtonGroup Если добавить в один такой контейнер несколько элементов JRadioButton, то выбранным всегда будет только один из них.

getElements() - возвращает все ее элементы в виде коллекции Enumeration. По коллекции можно пройтись итератором и найти выделенный элемент.

Текстовое поле JTextField

Для создания текстового поля чаще всего используются конструкторы:

JTextField(int columns) — создает пустое текстовое поле, ширина которого достаточна для размещения columns символов. При этом пользователь может вводить в текстовое поле строку какой угодно длины: она просто будет прокручиваться.

get/setCaretPosition() - Возвращает позицию курсора (каретки) в текстовом поле и позволяет задать ее программно.

setHorizontalAlignment(int align) -Выравнивание текстового поля в качестве параметра передается одна из констант выравнивания, определенных в этом же классе JTextField: LEFT, CENTER, RIGHT.

Поле для ввода пароля JPasswordField

JPasswordField является прямым потомком JTextField, поэтому для него справедливо все сказанное выше. JPasswordField является прямым потомком JTextField, поэтому для него справедливо все сказанное выше.

Область для ввода текста JTextArea

JTextArea также является потомком JTextField и наследует все его методы.

Панель прокрутки JScrollPane

setHorizontalScrollBarPolicy(int policy) — позволяет задать стратегию работы с горизонтальной полосой прокрутки. Возможные значения представлены константами HORIZONTAL_SCROLLBAR_ALWAYS (отображать всегда), HORIZONTAL_SCROLLBAR_AS_NEEDED (отображать при необходимости) и HORIZONTAL_SCROLLBAR_NEVER (не отображать никогда). Данные константы определены в интерфейсе ScrollPaneConstants.

setVerticalScrollBarPolicy(int policy) позволяет задать стратегию работы с вертикальной полосой прокрутки посредством констант VERTICAL_SCROLLBAR_ALWAYS, VERTICAL_SCROLLBAR_AS_NEEDED и VERTICAL_SCROLLBAR_NEVER

Инструментальная панель JToolBar

В Swing для инструментальных панелей разработан визуальный компонент JToolBar, в котором заложена просто потрясающая функциональность.

JToolBar(String title, int orientation) Для создания вертикальной панели где параметр orientation задается константой VERTICAL из интерфейса SwingConstants.

is/setFloatable(boolean floatable) — разрешает либо запрещает (по умолчанию разрешает) пользователю откреплять панель от места ее начального расположения.

Выпадающий список JComboBox

Выпадающий список — весьма распространенный элемент управления. Он содержит множество вариантов, из которых пользователь может выбрать один и только один, либо (если выпадающий список это позволяет) ввести свой собственный.

insertItemAt(Object item, int index) - Позволяющим уточнить позицию, в которую требуется вставить элемент.

setEditable(boolean editable) Чтобы пользователь мог ввести свой вариант, который не присутствует в списке, должен быть вызван метод с параметром true.

Ползунок JSlider

Ползунок позволяет пользователю выбрать некоторое число из диапазона доступных значений, наглядно представив этот диапазон.

JSlider(int orientation, int min, int max, int value) Конструктор первый параметр ориентация ползунка (HORIZONTAL или VERTICAL).

setMajorTickSpacing(int spacing) - Позволяет задать расстояние, через которое будут выводиться большие деления.

Панель со вкладками JTabbedPane

Многим программам бывает необходимо разместить в одном окне большое количество элементов управления, некоторые из которых (такие как списки, деревья, текстовые области и т.д.) могут к тому же занимать приличное пространство.

Список JList

Список содержит группу элементов, аналогично выпадающему списку JComboBox, но обладает двумя отличительными особенностями. Во-первых, на экране видны одновременно несколько элементов списка. Во-вторых, пользователь может выбрать в списке не один элемент, а несколько (если установлен соответствующий режим выделения).

Создать список можно с помощью конструктора, работающего на основе массива Object[] или вектора Vector (аналогично JComboBox).

setSelectionMode(int mode) указывает на ListSelectionModel:SINGLE_SELECTION — может быть выделен только один элемент, SINGLE_INTERVAL_SELECTION — может быть выделено несколько элементов, но составляющих непрерывный интервал,MULTIPLE_INTERVAL_SELECTION — может быть выделено произвольное количество смежных и несмежных элементов.

set/getSelectedIndex() и set/getSelectedIndices() - возвращают они не сами выделенные элементы, а их индексы.

JTable Таблицы

Для отображения табличных данных используется комопнент JTable. JTable внутри себя не содержит данные, а служит только для их отображения.

JFileChooser для выбора файла


При работе с файлами из приложения возникает необходимость рано или поздно использовать диалог для выбора файлов.

JProgressBar полоса загрузки

JMenuBar


Стандартные диалоговые окна

Менеджер размещения

В некоторых старомодных языках программирования необходимо было указывать координаты и размеры каждого компонента окна. Это работало хорошо, если было известно разрешающая способность экрана каждого пользователя. В Java есть схемы размещения (Layout Managers) , которые позволяют разместить компоненты на экране, не зная точных позиций компонентов. Схемы гарантируют, что та часть интерфейса, за которую они отвечают, будет выглядеть правильно в не зависимости от размеров окна и разрешения экрана.

Менеджер последовательного размещения FlowLayout

Менеджер граничного размещения BorderLayout

Менеджер размещения BorderLayout разделяет панель на пять областей: центральную, верхнюю, нижнюю, правую и левую. В каждую из этих областей можно добавить ровно по одному компоненту, причем компонент будет занимать всю отведенную для него область. Компоненты, добавленные в верхнюю и нижнюю области, будут растянуты по ширине. обавленные в правую и левую — по высоте, а компонент, добавленный в центр, будет растянут так, чтобы полностью заполнить оставшееся пространство панели.

Менеджер табличного размещения GridLayout

GridLayout разбивает панель на ячейки одинаковой ширины и высоты (таким образом окно становится похожим на таблицу). Каждый элемент, добавляемый на панель с таким расположением, целиком занимает одну ячейку. Ячейки заполняются элементами по очереди, начиная с левой верхней.

Этот менеджер, в отличие от рассмотренных ранее, создается конструктором с параметрами (четыре целых числа). Необходимо указать количество столбцов, строк и расстояние между ячейками по горизонтали и по вертикали.

Менеджер блочного размещения BoxLayout и класс Box

Менеджер BoxLayout размещает элементы на панели в строку или в столбец. Обычно для работы с этим менеджером используют вспомогательный класс Box, представляющий собой панель, для которой уже настроено блочное размещение. Создается такая панель не конструктором, а одним из двух статических методов, определенных в классе Box: createHorizontalBox() и createVerticalBox().

Горизонтальная распорка создается статическим методом createHorizontalStrut(int width), а вертикальная — методом createVerticalStrut(int height). Оба метода определены в классе Box, а целочисленный параметр в каждом из них определяет размер распорки.

Ручное размещение элементов

Если в качестве менеджера размещения панели установить null, элементы не будут расставляться автоматически. Координаты каждого элемента необходимо в этом случае указать явно, при этом они никак не зависят от размеров панели и от координат других элементов. По умолчанию координаты равны нулю (т.е. элемент расположен в левом верхнем углу панели). Размер элемента также необходимо задавать явно (в противном случае его ширина и высота будут равны нулю и элемент отображаться не будет). Координаты элемента можно задать одним из следующих методов:

Инструменты страницы

За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: GNU Free Documentation License 1.3

Вместе с регилируемыми настройками интерфейса можно сохранить и измененные значения компонентов формы, чтобы при повторном открытии формы в течении одного сеанса работы приложения их можно было бы восстановить.

Структура проекта


Структура проекта включает проектный файл pom.xml, набор свойств в директории (resources/properties) и два класса : JPanelActivator и JPanelForm. JPanelActivator играет роль активатора бандла. JPanelForm формирует интерфейс панели. Проектный файл pom.xml включает все зависимости модуля, параметры GAV и определяет порядок сборки бандла. Листинги исходных кодов представлены на странице описания бандла templ-jpanel.

Таким образом, чтобы ориентироваться в структуре проекта создания бандла, Вам необходимо иметь представление о Maven и OSGi.

Описание

Активатор JPanelActivator оставим без изменений. Также, практически без изменений останется проектный файл pom.xml, если не считать изменения в наименовании артифакта (artifactId), выполненное ранее. Как было отмечено выше, в интерфейс JPanelForm внесем изменения, связанные с размещением в панели таблицы.

Класс JPanelForm

Описание полей

К описанию полей, связанных со сплитерами, добавлены описания параметров таблицы. Строковые константы SPLITPANE_H, SPLITPANE_V и GRIDNAME используются при восстановлении регулируемых настроек интерфейса, описанных в уроке 6.

Конструктор класса

Конструктор класса, листинг которого представлен ниже, не изменился. Сначала вызывается конструктор базового класса (суперкласса), после этого в переменную cparams загружаются ранее сохраненные значения регулируемых настроек интерфейса методом базового класса readComponentParams().

Создание таблицы

Создание таблицы выполняется методом createGrid(). Сначала создается объект grid, у таблицы которого определяется наименование GRIDNAME, после чего восстанавливаются размеры колонок. Для получения описания размеров колонок таблицы (объект ComponentParams) используется родительский метод extractComponentParams с параметрами наименования класса и наименования объекта. Примеры использования Grid приведены в разделе описания библиотеки интерфейсных компонентов base-gui.

Создание интерфейса

Локализация интерфейса

Метод changeLocale читает локализованные свойства модуля методом loadProperties (path, locale) и вызывает соответствующий метод объекта Grid.loadProperties(Properties) для определения заголовков колонок.

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

На этом разработка бандла заканчивается. Выполняем сборку и определяем конфигурацию приложения.

Конфигурация приложения

В конфигурацию приложения включим исходный бандл templ-jpanel, вновь созданный бандл templ-jpanela и модуль определения языка локализации form-locale.

Листинг configuration/bundles.ini

Список используемых в приложении бандлов определяем в файле configuration/bundles.ini.

Листинг configuration/toolbar.xml

В файле configuration/toolbar.xml определим структуру панели инструментов и свяжем кнопки с вызываемыми при их нажатии бандлами.

Старт приложения

На следующем скриншоте представлен интерфейс приложения после старта модуля templ-jpanela, открытии окна смены языка локализации и перехода на английский язык.


Помните, что смена панелей сопровождается остановкой бандла, т.е. переводом бандла в состояние RESOLVED. При очередном старте модуля нажатием на кнопку панели инструментов, т.е. переводе модуля в состояние STARTED, выполняется вызов метода активатора start, и модуль по-новому формирует свою интерфейсную панель.

Связанные страницы

Скачивание файлов

Необходимые бандлы, файлы конфигурации и файл описания инсталлируемых бандлов собраны и упакованы в один архивный файл configuration.lesson13.zip (400 Кб).

Используемый в уроке бандл templ-jpanel можно скачать на странице описания templ-jpanel. Бандл templ-jpanela в виде проекта IDE Eclipse можно скачать здесь.

Читайте также: