1 | |||||||||||
Изображения стандартных компонентов06.07.2014, 14:55. Показов 925. Ответов 10
Метки нет (Все метки)
Всем привет.
Столкнулся с небольшой проблемой в ходе разработки приложения. Суть приложения такова - есть панель Toolkit с набором компонентов, доступных для использования (перетаскивания) и панель рабочего пространства, куда элементы перетаскиваются. Процесс перетаскивания реализую через MouseMotionListener интерфейс.
Если мы добавим кнопку как слушателя событий мыши - это сработает, но результат будет отвратным - отображение на экране будет двоиться, кнопка будет отпрыгивать от курсора при нажатии и так далее. Можете убедиться скомпилировав и запустив код, приведенный выше... Я придумал довольно простое решение - создать панель, установить такой размер, чтобы туда могла поместиться только кнопка (аналогичный размер), переопределить метод paintComponent() и при каждой прорисовке панели рисовать изображение (иконку) кнопки. Когда я перетащу кнопку на рабочую панель, я получу событие EnterEvent и на месте панели размещу самую натуральную кнопку... Возможно, это довольно глупое решение, но пока ничего лучше в голову не пришло. Если вы знаете, как решить проблему с перемещением кнопки с корректным отображением - буду рад выслушать. А пока вопрос такой - как получить иконку кнопки? P.S. button.getIcon() возвращает null.
0
|
06.07.2014, 14:55 | |
Ответы с готовыми решениями:
10
Разработка приложений с использованием стандартных и дополнительных компонентов. Динамическое создание компонентов. Просмотреть листинг стандартных компонентов Переопределение свойств у стандартных компонентов Использование стандартных компонентов stl |
Форумчанин
5955 / 4190 / 405
Регистрация: 28.12.2013
Сообщений: 24,134
|
||||||
06.07.2014, 18:23 | 2 | |||||
так можно же прикрепить слушатель к панели.
Добавлено через 12 минут
0
|
06.07.2014, 19:10 [ТС] | 3 |
Дальше в тексте я объясняю, почему не получится. Кнопка - интерактивный компонент, она сама является источником событий, и у нее свои слушатели. То есть если мы попытаемся добавить слушателя в панель, потом в панель добавить кнопку, то нажав и переталкивая кнопку по панели, ничего не получится, если пиксели события принадлежат кнопке, причину выше написал. Получается, мы никак не сможем узнать - тащит ли программист кнопку, если будем слушать панель.
Я расписал оптимальный вариант, но для этого нужны иконки, а как их получить программно - я не разобрался.
0
|
Форумчанин
5955 / 4190 / 405
Регистрация: 28.12.2013
Сообщений: 24,134
|
|
06.07.2014, 19:32 | 4 |
тоесть ты хочешь с 1 панели перетащить элемент в другую?А что если сделать прозрачную панель и перетаскивать элементы по ней?
Забавная задачка попробую сегодня.
0
|
06.07.2014, 19:54 [ТС] | 5 |
У компонентов из инструментария есть переходное состояние - смена овнера. Когда мы выходим за рамки панели инструментов - фрейм становится слушателем, потом при заходе на основное пространство слушатель переходит к ворк спейсу, другие компоненты удаляют слушателя. С этим проблем нет. Но мне нужны иконки...
0
|
Форумчанин
5955 / 4190 / 405
Регистрация: 28.12.2013
Сообщений: 24,134
|
|
06.07.2014, 19:58 | 6 |
0
|
Форумчанин
5955 / 4190 / 405
Регистрация: 28.12.2013
Сообщений: 24,134
|
|
06.07.2014, 23:33 | 8 |
в принципе,кнопка может быть просто прямоугольником с градиентом,так же как и менюбар
Не думаю что ява скрывает иконку после вызова метода гетикон. Добавлено через 2 часа 59 минут в исходниках явки конструктор по умолчанию дает параметр иконки null
0
|
Форумчанин
5955 / 4190 / 405
Регистрация: 28.12.2013
Сообщений: 24,134
|
|
07.07.2014, 01:53 | 10 |
забавная проблема,хотя для моей работы и не нужная
Просерчил исходники,что-то зацепов пока не вижу на иконку.
0
|
07.07.2014, 22:23 [ТС] | 11 |
В общем, пошел другим путем. Прорисовка переталкивания фигур вышла накладной - нужно определять верные пиксели относительно сразу двух панелей, вычислять относительное положение компонента и от сюда получать пиксели верные. К тому же во время переходного состояния компонент должен обрисовывываться сразу в 3х контейнерах, поэтому пришлось добавлять в каждый контейнер компонент, который "растет" по мере переталкивания, а потом и вовсе удаляется. Пусть это и не занимает много памяти, но трата все же идет больше, чем можно было ожидать. Ну и естественно такой подход не дает никакой гибкости.
В раздумьях был и пришел к такому варианту. Есть панель инструментов - она представляет собой кастомный лист (список JLabel - иконка и текст). При выборе элемента - его изображение переносится в Clipboard - буфер, в котором хранится выдранный из списка элемент. Как только элемент попал в буфер - можно тыкнуть на любую область в workspace панели и установится изображение кнопки (не оригинальное). Буфер очищается, выдранный элемент перестает быть выбранным. Компоненты на рабочей панеле можно переталкивать. Но это не все. Когда нужно посмотреть - как будет выглядеть кнопка на этом месте - все компоненты удаляются, сериализуются (для восстановления) и на их местах появляются самые настоящие кнопки. Их двигать нельзя - они самостоятельные компоненты. Когда нужно изменить позиции - возвращается к рабочему состоянию, удаляем кнопки и на их местах появляются десермализованные компоненты. Пока есть один нюанс - как при крепить маленькую иконку к курсору? Конечно, можно сделать кастомный курсор, но наверняка есть способ это сделать через API. Буду рад помощи. P.S. Рад бы и сам порыскать API, но приходится временно вечера коротать с одним телефоном и медленным интернетом.
0
|
07.07.2014, 22:23 | |
07.07.2014, 22:23 | |
Помогаю со студенческими работами здесь
11
Разработка приложений с использованием стандартных компонентов. Модификация стандартных компонентов использующих TStrings UDP чат без использования стандартных компонентов UDP чат без использования стандартных компонентов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |