Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Swing. Взаимодействие контролов на интерфейсе 
:(
    Опции темы
anti_snayper
Дата 8.2.2011, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 13.2.2007

Репутация: нет
Всего: нет



Есть календарь, написанный на свинге. Выполнен в виде JMenuPopup с набором кнопок, ддл, текстовым полем. Он встраивается в интерфейс с другими контролами. Нужно чтобы при клике на внешнем контроле календарь скрывался, при клике на внутреннем позволял произвести выбор значения(например, ддл выбора месяца).  Я могу перехватывать в нем события changeState или связанные с изменением фокуса. Но не знаю как узнать от кого оно пришло. К примеру, в случае с ддл, ивент говорит, что создатель события - MenuSelectionManager, из которого ничего полезного выудить не получается.

Как решают такие ситуации? Наверняка же должен какой-то типовой подход...

Спасибо.
PM MAIL   Вверх
_Y_
Дата 8.2.2011, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 1
Всего: 34



Ну а если разными слушателями (Listener) разные клики отслеживать? А в слушателе прописать атрибут, который знает "хозяина"?


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
anti_snayper
Дата 9.2.2011, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 13.2.2007

Репутация: нет
Всего: нет



Утром торопился потому написал видимо не очень понятно. Попробую еще раз... На интерфейсе есть JComboBox-ы. При клике на каком либо из них автоматом генерится стандартное событие, которое оповещает остальные элементы интерфейса о том что им надо закрыться. Это обычное поведение любого интерфейса. Я добавил выпадающий по клику на кнопке календарь, который выполнен в виде JMenuPopup. В нем есть JComboBox с месяцами. Так вот при клике на этом ддл - календарь закрывается. Т.е. этот контрол генерит событие которое закрывает свой собственный контейнер(JMenuPopup). Такого само собой быть не должно.
Я недавно занялся свингом и вполне возможно что-то недопонимаю. 
PM MAIL   Вверх
_Y_
Дата 9.2.2011, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 1
Всего: 34



Вместо стандартного Listener пишешь свой, наследующий от стандартного.  Я сейчас не могу посмотреть видно ли из кода Listener-а на каком контроле кликнули. 
  • Если  да, в коде обработки события пишешь "закрыть все JComboBox-ы, кроме того, на котором кликнули".
  • Если нет, пишешь у Listener-а атрибут, указывающий на "свой" JComboBox. Уже в конструкторе Listener-а присваиваещь значение этому атрибуту. В коде обработки события пишешь "закрыть все JComboBox-ы, кроме того, на который указывает этот атрибут". Понятное дело, каждому  JComboBox-у создаещь и присваиваешь свой обьект этого Listener-ого класса.

Хочешь напишу код. Но быстро не обещаю. В форуме сижу пока компы делом заняты. Может вечерком или завтра.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
anti_snayper
Дата 9.2.2011, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 13.2.2007

Репутация: нет
Всего: нет



За пример был бы  очень благодарен... Можете сказать какой event оповещает остальные элементы интерфейса о своем закрытии? 

Это сообщение отредактировал(а) anti_snayper - 9.2.2011, 15:46
PM MAIL   Вверх
_Y_
Дата 9.2.2011, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 1
Всего: 34



Поскольку я не знаю что за классы вы используете в качестве календарей, набросал пример иллюстрирующий общий принцип. Работает по первому варианту. Оказалось я помнил правильно и событие знает на каком объекте кликнули.

Програмка показывает множество кнопок. При клике на одну кнопку она увеличивается, а размеры остальных становятся стандартными. Что непонятно - спрашивайте.

Код

import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;


public class DemoClickableButtons extends JFrame{
    
    private static final int N_BUTTONS = 35;
    
    private static final Dimension SMALL_BUTTON = new Dimension(70, 30), BIG_BUTTON = new Dimension(120, 50);
    
    private JButton[] buttons;
    
    public DemoClickableButtons(){    
        super();
        
        //Form-related steps
        
        this.setLayout(new FlowLayout());
        this.setSize(900, 200);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        //Create buttons
        
        buttons = new JButton[N_BUTTONS];
        
        for(int i = 0; i < N_BUTTONS; i++){
            
            //Create button
            
            buttons[i] = new JButton("Button " + i);
            
            //Create and add action listener
            
            buttons[i].addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    
                    //Change size of the buttons if a button is clicked
                    
                    for(JButton but : buttons){
                        if(but == (JButton)evt.getSource()){
                            but.setSize(BIG_BUTTON);
                        } else {
                            but.setSize(SMALL_BUTTON);
                        }
                    }
                    
                }
            });
            
            //Add buttons to the form
            
            this.add(buttons[i]);

            
        }
        
        //Show the form
        
        this.setVisible(true);
    }
    
    


    public static void main(String[] args) {
        new DemoClickableButtons();
    }

}



--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
anti_snayper
Дата 10.2.2011, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 13.2.2007

Репутация: нет
Всего: нет



Вот простой пример . Есть 2 JComboBoxa. Кликаем по первому - он открывается. Кликаем по второму - первый закрывается, второй открывается. Вот меня и интересует. Какой listener мне нужно переопределить и как, чтобы они друг друга не закрывали? 

Код

import java.awt.Color;
import java.awt.FlowLayout;

import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class TestListeners extends JFrame{
    
    private JPanel panel;
    private JComboBox comboBox1;
    private JComboBox comboBox2;
    
    private String[] commonItems = new String[] {"1", "2", "3"};
    
    public TestListeners(){    
        super();
        
        this.setLayout(new FlowLayout());
        this.setSize(200, 200);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        panel =  new JPanel();
        panel.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.BLACK));
        comboBox1 = new JComboBox(commonItems);        
        comboBox2 = new JComboBox(commonItems);
                
        panel.add(comboBox1);
        panel.add(comboBox2);
        add(panel);        
        setVisible(true);
    }
    
    
    public static void main(String[] args) {
        new TestListeners();
    }
}


Это сообщение отредактировал(а) anti_snayper - 10.2.2011, 01:07
PM MAIL   Вверх
_Y_
Дата 11.2.2011, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 1
Всего: 34



Эге. Теперь проблема понятнее. Надо подумать.  Закрытие JComboBox, видимо, связано с потерей им фокуса, но я не уверен - надо проверять.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
anti_snayper
Дата 11.2.2011, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 13.2.2007

Репутация: нет
Всего: нет



Решил оставить поведение JComboBox-ов как есть, адаптировав под него интерфейс.  

P.S. Вообще  была идея использовать вместо JMenuPopup - JDialog. При этом проблема решается сама собой, но нужно поколдовать над диалоговым окном для его кастомизации под попап. Думаю, что этот вариант вполне реализуем, но надо проверять.
PM MAIL   Вверх
_Y_
Дата 11.2.2011, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 1
Всего: 34



Если не заморачиваться именно с JComboBox-ами, то можно написать самому их иммитацию. На JPanel поместить текстовое поле и обычный список JList ниже него. Этот список прятать-показывать когда захочется. Но в этом случае, естественно, придется много кодить рутинных вещей.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0810 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.