LINUX.ORG.RU

Интерфейс, Java, Swing, как сделать?


0

0

Вопрос будет слишком абстрактным, поэтому расскажу, как сейчас реализована одна возможность и что в реализации не нравится. Вопрос вообще-то простой: как сделать это правильно? Уточнения вопроса в процессе.

Сейчас в приложении реализована такая задумка: есть редактируемый комбобокс. Пользователь вводит в него некую строку с wildcard'ами, для простоты, будем считать, что это просто *, нажимает на стрелочку, чтобы выпало меню. В этот момент приложение связывается с сервером, сообщает ему пользовательский шаблон, сервер сообщает все строки, которые с ним совпадают, приложение набивает ими попап-меню и показывает его пользователю. Пользователь выбирает строку, она становится выбранным элементом комбобокса. Также, пользователь может просто ввести строку в редактируемый комбобокс и ничего не делать с попапом, она просто станет selected item.

Сейчас подгрузка сделана так: пользователь вводит свой шаблон, нажимает стрелочку. Вызывается метод beforePopupComesVisible у соотвествующего листенера. Этот метод вызывается, как следует из названия, строго перед показом попапа. В коде метода (1) Попап скрывается :) (2) в отдельном треде получается список (3) тот тред перекидывает в свинговский тред задания: набить список комбобокса результатом и показать попап. Криво. В какой момент и как это должно происходить по нормальному? Чтобы сначала набивался список, а потом уже показывался попап? Дизайн менять очень-очень не рекомендуется. Да, и второй раз посмотреть полученный список нельзя, при попытке его открыть снова идёт запрос серверу, но это пофиксить уже реально.

И ещё, возникает несколько багов. Если из того листенера вызвать модальный диалог (с сообщением о синтаксической ошибке в шаблоне, они там возможны), то кнопка со стрелочкой останется залипшей, попап меню не скроется и будет куча других реализация-и-версия-java-машины-related багов. На IBM'овской Джаве, если в списке нету введённого пользователем шаблона, а его там быть не может, введённый пользователем шаблом исчезает на время показа списка.

В-общем, вот. Понятно, что гвозди микроскопом забиваются. Я бы сделал что-то типа второй кнопки, заполняющей комбобокс, а его родной кнопке оставил бы первоначальную функциональность, но дизайн менять, как сказано выше, скорее всего нельзя. Вот.

anonymous
Ответ на: комментарий от anonymous

Я думал, такие как ты, вымерли от рака ещё в 2006, когда мода на удав сменилась модой на башорг.

anonymous
()

Ну раз глючит - три варианта: искать и фиксить баги; написать свой комбобокс; изменить вариант интерфейса. Я за третий вариант, комбобокс, запрашивающий данные по сети перед открытием это, мягко говоря, непривычный контрол.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Спасибо за ответ. Сейчас пофиксил таким хаком: добрался через getComponents() до кнопки комбобокса, нашёл у неё листенер, открывающий попап и заменил его на свой, который сначала получает контент, а потом показвыает попап. Во время получения данных на панели крутятся шестерёнки, это во всём проекте так. Проблема в том, что в следующих версиях Java никто не гарантирует, что этот листенер будет там-же.

Это единственный путь реализовать такой дизайн. А не подскажешь Ъ-дизайн для этого? Если подсунуть готовый вариант, может и согласятся.

anonymous
()
Ответ на: комментарий от anonymous

Гм, такой же компактный в неактивном виде - хз. А так - edit box с list box-ом внизу, при вводе сразу производится подкачка инфы и показывается. Как то так. Вообще не знаю, наверное комбобокс тоже нормально. Может быть что то вроде поиска в URL Bar-е современных браузеров при наборе адреса (или, что ближе, подсказка гугла при наборе поиска, там как раз подкачка информации происходит).

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

> А так - edit box с list box-ом внизу, при вводе сразу производится подкачка инфы и показывается

В смысле, просто соединить обычный TextField или как там его и выпадающее меню?

> Может быть что то вроде поиска в URL Bar-е современных браузеров при наборе адреса

Хм. Можно подумать.

> (или, что ближе, подсказка гугла при наборе поиска, там как раз подкачка информации происходит).

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

К тому-же, тут не просто дополнение текста, а сравнение с довольно сложными шаблонами, и список результатов может быть внушительных размеров. Лишний раз дёргать сервер не стоит.

Я вот думаю, был бы такой - Two Button ComboBox. Ну да сделать несложно. Одна кнопка - раскрыть, вторая - получить данные и заполнить. Как идея?

anonymous
()
Ответ на: комментарий от anonymous

> В смысле, просто соединить обычный TextField или как там его и выпадающее меню?

Нет, поставить сверху текстфиелд, снизу listbox и кнопочку поиска справа от текстфиелда :) Просто и тупо, по крайней мере сразу ясно, что это поиск, но, скорее всего, в ваш дизайн не впишется.

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

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

> В принципе я сейчас за комбобокс :)

Ну так я говорю - обрабатывать beforePopupComesVisible - криво, т.к. попап приходиться скрывать и показывать снова, а ковыряться в кишках комбобкса и переопределять мышиный лисенер кнопки - хак, хотя и работающий на всех версиях и реализациях, на которых удалось протестировать, даже на ещё не выпущенной Sun 7.

> Кстати не знаю, как санки реагируют на баги

Главное, чтобы на IBM'овской машине работало. :)

> можно рассчитывать на их фиксинг.

В виде апдейта к Java 5, которая используется(решаем не мы), или в следующей версии 7?

Кстати, а вот такой вопрос, по Reflection. Есть три инстанции трёх классов, реализаций одного интерфейса, MouseListenter. Нужно найти ту из них, в коде одного метода, mousePressed(), которой содержится вызов определённого метода определённого класса, JComboBox.showPopup(). Такое возможно?

anonymous
()
Ответ на: комментарий от anonymous

> Кстати, а вот такой вопрос, по Reflection. Есть три инстанции трёх классов, реализаций одного интерфейса, MouseListenter. Нужно найти ту из них, в коде одного метода, mousePressed(), которой содержится вызов определённого метода определённого класса, JComboBox.showPopup(). Такое возможно?

Через рефлекшн невозможно. Наверное возможно через анализ байткода.

Legioner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.