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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по динамически создаваемой форме 
:(
    Опции темы
Pablos
Дата 20.4.2010, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте.

Вопрос скорее связан по применению ООП в Java при разработке динамически соддаваемых окон, компонентов и обработке событий от них.

Создаваемая, сейчас, мною конструкция категорически не нравится. Но ничего более дельного в бошку не лезет.
Прошу указать на очевидные КОНЦЕПТУАЛЬНЫЕ ОШИБКИ в построении ООП приложения. Т.е. я не прошу написать за меня код, а указать на места логических ошибок в схеме приложения.

---------------------------------------------------------------------------------

Задача: нужно состряпать динамически создаваемую форму (не одну) с кнопками, гридами (данные из/в БД), лэйблами и т.п. И есс-но обрабатывать события нажатия тех же кнопок. Например: нажатие кнопки "Обновить" вызывает запрос в БД.

Для этого я создаю несколько классов:
    1. класс BD - для работы с БД;
    2. класс UTM - модель (для MVC);
    3. класс GUI - здесь стряпаю элементы. Пример:

Код

    public GUI(int x, int y, int width, int height, String title)
    {
          JFrame.setDefaultLookAndFeelDecorated(true);
          frame = new JFrame(title);
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

          if((width == 0) & (height == 0))
        {
            Toolkit kit = Toolkit.getDefaultToolkit();
            Dimension screenSize = kit.getScreenSize();
            width = screenSize.width;
            height = screenSize.height;
        }

          frame.setPreferredSize(new Dimension(width, height));
          frame.setResizable(true);
          frame.pack();
          frame.setVisible(true);     
    }

    public void validate()
    {
        this.frame.validate();
    }

    public JPanel addPanel()
    {
        JPanel panel = new JPanel();
        return panel;
    }

    public JLabel addJLabel(int width, int height, String text)
    {
        JLabel label = new JLabel(text);
        label.setSize(width, height);
          this.frame.getContentPane().add(label, BorderLayout.WEST);
          return label;
    }

    public JTable addJTable(DB db, ResultSet rs)
    {
        TableModel tableModel = new UTM(db, rs);
        JTable table = new JTable(tableModel);

          JScrollPane scrollPane = new JScrollPane(table);
          this.frame.add(scrollPane, BorderLayout.WEST);
          
          
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tableModel);
        table.setRowSorter(sorter);

        table.setVisible(true);

        return table;
    }

    public JButton addButton(int x, int y, int width, int height, String textBut, Color color, String tooltip)
    {
        if(color == null) color = Color.lightGray;
        JButton button  = new JButton(textBut);
        button.setBounds(x, y, width, height);
        button.setBackground(color);
        button.setToolTipText(tooltip);
        button.addActionListener(new ButtonListener());

        return button;
    }



Здесь же в GUI создан класс ButtonListener

Код

class ButtonListener implements ActionListener
   {
      // Метод интерфейса для получения нажатий кнопки
      public void actionPerformed(ActionEvent e)
      {
         if(e.getActionCommand().equals("Обновить")) System.out.println("Нажата кнопка <<Обновить>>");


Ничего более дельного, чем:
Код

     JButton button = e.getSource();
         JPanel panel = button.getParent();
         JFrame frame = panel.getParent().getParent();
    .....
    .....
    JTable table = .....

для обращения к таблице я не придумал.

      }

      
   }



    4. класс Forms - там вызывается конструктор BD c SQL запросом, конструктор GUI, вызывается addTable  и туда передается BD и ResultSet полученный в результате запроса. Пример:

    
Код

    DB db = new DB();
            DB.initPoolConnection(); // статический метод инициализации пула подключений к БД //

            db.DQL("SELECT * FROM table");
            ResultSet rs = db.getResultSet();

            GUI test = new GUI(0, 0, 800, 400, "Название окна");

            JTable table = test.addJTable(db, rs);



-------------------------------------------------------------------------------------------

Что-то вроде того. Специально не постил много кода, если потребуется уточнить какие-либо места, с радостью это сделаю.


Всем заранее спасибо за помощь и дельные советы.)
PM MAIL   Вверх
batigoal
Дата 21.4.2010, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

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



Не совсем понял я, какие именно места кода тебя самого не устраивают, но я бы выделил создание компонентов в отдельный класс GuiBuilder. 

Что касается обращения к таблице, то в какой именно точке кода у ней нужно обращаться? Из лисенера кнопки?

Почему нельзя просто добавить метод для доступа к таблице (GUI.getTable())?
ButtonListener при этом может хранить ссылку на окно.

Код

class ButtonListener implements ActionListener
{
  GUI gui;
  public ButtonListener(GUI gui)
  {
     this.gui = gui
  }
  ....
}

class GUI
{
   public JButton addButton(...)
  {
     ....
     button.addActionListener(new ButtonListener(this));
  }

  public getTable {
    return ...
  }
}

Ну а если класс ButtonListener можно сделать внутренним - тогда и передавать ничего никуда не придется, его экземпляр и так сможет доступаться до полей объекта GUI.

Это сообщение отредактировал(а) batigoal - 21.4.2010, 16:35


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Pablos
Дата 22.4.2010, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



butigoal, спасибо за ответ.

>> Что касается обращения к таблице, то в какой именно точке кода у ней нужно обращаться? Из лисенера кнопки?
>> Почему нельзя просто добавить метод для доступа к таблице (GUI.getTable())?
>> ButtonListener при этом может хранить ссылку на окно.

Спасибо за ценную мыслю.
Была идея создавать по одному экземпляру GUI на форму.
Но Table на одной форме может быть > 1. Тогда не совсем понятно, какую я должен взять по .getTable().
Хочется, чтобы на этапе создания элемента он уже был "привязан" к объекту, который должен изменить.
Я решил сейчас сделать вспомогательные классы, пример:

Код

class myButton extends JButton
{
      Object ref;

      public myButton(Object ref) {this.ref = ref;}
      public Object getRef() { return this.ref; }
.....
.....
.....
}

.........................................

class GUI
{

    public addButton(Object ref)
    {
      myButton button = new myButton(ref);
      ...........
      ...........
    }
           

}




Т.е. на этапе создания кнопки делать так:

Код

addButton(JTable);


И дальше в лисенере я смогу проверять какой именно объект хранится использовав .getRef().
Как такая идея?


>> Не совсем понял я, какие именно места кода тебя самого не устраивают, 
Я нутром чувствую, что с распределением ответственности какая-то лажа происходит.
Хочу узнать как мэтры делают.
Может есть толковая литература именно по применению Java'вского ООП в графических интерфейсах?
PM MAIL   Вверх
batigoal
Дата 22.4.2010, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

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



Давай сделаем так: ты озвучишь исходную задачу, а дальше подумаем, какими средствами её можно реализовать. Потому что пока картинка видна урывками.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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