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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> RSS клиент 
V
    Опции темы
Shklyar
Дата 4.9.2008, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



GUI, для меня, получилась самой сложной темой. layout решил взять попроще. В общем вот, что сделал:
Код
package rssclient;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.AbstractListModel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.ListSelectionEvent;

import java.util.Iterator;
import java.util.Vector;

import java.sql.SQLException;

/**
 *
 * @author Oleg
 */
public class MainForm extends JFrame implements ActionListener,
        ListSelectionListener {
    // Names for buttons
    private static final String OPEN_FEED = "openFeed";
    private static final String NEW_FEED = "newFeed";
    private static final String UPDATE_FEED = "updateFeed";
    private static final String DELETE_FEED = "deleteFeed";
    private static final String UPDATE_ARTICLES = "updateAtricles";
    private static final String DELETE_ARTICLE = "deleteArticle";
    private static final String CLOSE_TAB = "closeTab";
    
    public MainForm() {
        setTitle("RSS Client");
        
        // set layout for form
        getContentPane().setLayout(new BorderLayout());
        
        // create west panel
        JPanel west = new JPanel();
        west.setLayout(new BorderLayout());
        
        // create west button for open selected feed
        JButton btnOpenFeed = new JButton("Открыть канал");
        btnOpenFeed.setName(OPEN_FEED);
        btnOpenFeed.addActionListener(this);
        west.add(btnOpenFeed, BorderLayout.NORTH);
        
        // create other west buttons
        JButton btnAddFeed = new JButton("Добавить");
        btnAddFeed.setName(NEW_FEED);
        btnAddFeed.addActionListener(this);
        JButton btnUpdFeed = new JButton("Редактировать");
        btnUpdFeed.setName(UPDATE_FEED);
        btnUpdFeed.addActionListener(this);
        JButton btnDelFeed = new JButton("Удалить");
        btnDelFeed.setName(DELETE_FEED);
        btnDelFeed.addActionListener(this);
        
        // create panel for other west buttons
        JPanel westBtnPanel = new JPanel();
        westBtnPanel.add(btnAddFeed);
        westBtnPanel.add(btnUpdFeed);
        westBtnPanel.add(btnDelFeed);
        west.add(westBtnPanel, BorderLayout.SOUTH);
        
        // create list
        JList feedsList = new JList();
        feedsList.setModel(new AbstractListModel() {
            String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }        
        });
        feedsList.addListSelectionListener(this);
        west.add(new JScrollPane(feedsList), BorderLayout.CENTER);
        
        // create east tabbed pane
        JTabbedPane eastTabbedPane = new JTabbedPane();
        
        // create east panel, add this panel to east tabbed pane
        JPanel east = new JPanel();
        east.setLayout(new BorderLayout());
        eastTabbedPane.add("Channel 1", east);
        
        // create east buttons
        JButton btnUpdArticles = new JButton("Обновить новости");
        btnUpdArticles.setName(UPDATE_ARTICLES);
        btnUpdArticles.addActionListener(this);
        JButton btnDelArticle = new JButton("Удалить новость");
        btnDelArticle.setName(DELETE_ARTICLE);
        btnDelArticle.addActionListener(this);
        JButton btnCloseTab = new JButton("Закрыть вкладку");
        btnCloseTab.setName(CLOSE_TAB);
        btnCloseTab.addActionListener(this);
        
        // create panel for east buttons
        JPanel eastBtnPanel = new JPanel();
        eastBtnPanel.add(btnUpdArticles);
        eastBtnPanel.add(btnDelArticle);
        eastBtnPanel.add(btnCloseTab);
        east.add(eastBtnPanel, BorderLayout.NORTH);
        
        // create eastCenter panel
        JPanel eastCenter = new JPanel();
        eastCenter.setLayout(new GridLayout(2, 1));
        east.add(eastCenter, BorderLayout.CENTER);
        
        // create table
        JTable articlesTable = new JTable(getTitleAndDateFromDB(),
                getTableTitle());
        eastCenter.add(new JScrollPane(articlesTable));
        
        // create text area
        JTextArea summaryArea = new JTextArea();
        summaryArea.setText("Summary\nLink");
        eastCenter.add(new JScrollPane(summaryArea));
        
        // insert west and east in form
        getContentPane().add(west, BorderLayout.WEST);
        getContentPane().add(eastTabbedPane, BorderLayout.CENTER);
        
        //set corners for form
        setBounds(100, 100, 760, 500);
    }
    
    public static void main(String args[]) {
        MainForm mf = new MainForm();
        mf.setDefaultCloseOperation(EXIT_ON_CLOSE);
        mf.setVisible(true);
    }
    
    // for interface ActionListener
    public void actionPerformed(ActionEvent e) {
    }
    
    // for interface ListSelectionListener
    public void valueChanged(ListSelectionEvent e) {
    }
    
    private Vector getTitleAndDateFromDB() {
        Vector titleAndDate = new Vector();
        /*try {
            JDBC db = JDBC.getInstance();
            for (Iterator i = db.getAllArticles().iterator(); i.hasNext();) {
                Article article = (Article) i.next();
                Vector vector = new Vector();
                vector.add(article.getTitle());
                vector.add(article.getStringDate());
                titleAndDate.add(vector);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }*/
        Vector vector = new Vector();
        vector.add("T");
        vector.add("D");
        titleAndDate.add(vector);
        titleAndDate.add(vector);
        
        return titleAndDate;
    }
    
    private Vector getTableTitle() {
        Vector vector = new Vector();
        vector.add("Title");
        vector.add("Date");
        return vector;
    }
}

Появился вопрос: подскажите, как на JTable-е сделать SelectionListener?
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
garbuz
Дата 4.9.2008, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Shklyar @  4.9.2008,  17:49 Найти цитируемый пост)

Появился вопрос: подскажите, как на JTable-е сделать SelectionListener? 

Ну наверно стоит добавить листенер. Вот тут посмотри:
http://jug.org.ua/wiki/display/JavaAlmanac...Table+Component
http://java.sun.com/docs/books/tutorial/ui...onlistener.html

еще  может тут чего найдешь полезного  smile 
http://www.java2s.com/Code/Java/Swing-JFC/Table.htm


Это сообщение отредактировал(а) garbuz - 4.9.2008, 23:40
PM MAIL   Вверх
Shklyar
Дата 5.9.2008, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Сенкс,
Ну а вообще? Нужна критика, чтоб я мог ориентироваться в правильном ли направлении работаю.
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
garbuz
Дата 5.9.2008, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Shklyar, я вообще не специалист по юзабилити, но мне кажется что интерфейс вполне приличный, мне сразу стало все понятно что к чему smile Вот только бы я кнопку открыть перенес бы в какое-нибудь другое место, не смотриться она там smile Понравились симпатичные вкладочки!
Короче продолжай в том же направлении! Молоток!  smile 

PS. Как допишешь первую бету - готов потестить smile
PM MAIL   Вверх
Shklyar
Дата 6.9.2008, 02:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Для кнопки сделал отступ, стало лучше.
Получилось сделать листенер для таблицы (с второй ссылки).
Добавил модель для таблицы (модель - представление - контроллер).
+ всякая мелочь.

Основной вопрос - как и что необходимо сделать для корректной работы с JTabbedPane.
На каждой его вкладке должны быть следующие элементы:
Код
JPanel
     JPanel
          JButton
          JButton
          JButton
     JPanel
          JScrollPane
               JTable
     JPanel
          JScrollPane
               JTextArea

Каждая вкладка создается кнопкой вне JTabbedPane.
На одной вкладке JTabbedPane все сделано и прекрасно работает.
Добавить вкладку понятно как.
Вопрос в том, как организовать данные (т.е. связанную работу трех JButton, JTable и JTextArea на каждой вкладке, только внутри ее).

Думаю, что надо сделать отдельный (внутренний) класс для наполнения JTabbedPane.
В этот класс внести всю иерархию представления, модель таблицы и, наверно обработчики трех кнопок? Или как быть с обработчиками?
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Shklyar
Дата 6.9.2008, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Что, если сделать так:
1. Описать внутренний (в MainForm) класс, для наполнения вкладок (включить туда из MainForm() панель (и все ее содержимое), которую кладу на JTabbedPane).
2. При создании новой вкладки (через создание нового экземпляра вышеуказанного класса) заносить объект в ArrayList.
3. Т.е., неявным образом, выйдет, что вкладка и объект, который ее заполнил имеют одинаковый индекс (к объекту, который заполнил вкладку, можно будет получить доступ получив индекс активной вкладки и попросив элемент из ArrayList по этому индексу).

Прокомментируйте, плис.
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Shklyar
Дата 7.9.2008, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Сделал первую версию. Посмотрите, скажите свое мнение.


Присоединённый файл ( Кол-во скачиваний: 35 )
Присоединённый файл  RSSClient.7z 448,17 Kb
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Shklyar
Дата 7.9.2008, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Да, для программки необходима MySQL.
:|
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
garbuz
Дата 7.9.2008, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Shklyar, супер! Все работает! Завтра получше потыкаюсь и постараюсь написать конаструктив smile Молодец!  smile 

ЗЫ. А можно исходники сюда выложить? ну или хотя бы в приват? smile 

ЗЫЫ. Кстать mysql-connector есть версия поновее, 5 с чем-то smile

Это сообщение отредактировал(а) garbuz - 7.9.2008, 23:11
PM MAIL   Вверх
garbuz
Дата 7.9.2008, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

1) При редактировании канала, редактируется и надпись на вкладке, если канал открыт.
2) При редактировании канала, если он открыт, вкладка закрывается и тогда уже в следующий раз она откроется с новым именем smile
PM MAIL   Вверх
SoulKeeper
Дата 7.9.2008, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

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



Цитата(Shklyar @  7.9.2008,  21:36 Найти цитируемый пост)
Да, для программки необходима MySQL.
:| 


Для чего MySQL? Ибо так все делают? H2DB, HSQLDB, Apache Derby (и т.д.) - на вкус и цвет. Ну не будет обычный пользователь ставить MySQL, а RSS ридер - программа в первую очередь ориентирована на обычных пользователей. В общем, пока еше не поздно, лутше перейти на какую-то из джавишных баз данных. И скорость выше (т.к. не через сокеты связь) и весит меньше, да и ресурсы экономит.
PM MAIL   Вверх
Shklyar
Дата 8.9.2008, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(SoulKeeper @ 7.9.2008,  23:49)
Для чего MySQL? Ибо так все делают? H2DB, HSQLDB, Apache Derby (и т.д.) - на вкус и цвет. Ну не будет обычный пользователь ставить MySQL, а RSS ридер - программа в первую очередь ориентирована на обычных пользователей. В общем, пока еше не поздно, лутше перейти на какую-то из джавишных баз данных. И скорость выше (т.к. не через сокеты связь) и весит меньше, да и ресурсы экономит.

Тут вопрос кроется во мне. Просто я стремлюсь стать junior Java developer (в этом и есть цель этой программки - опыт, посмотрите по вопросам: xml + db + http + gui ++), а в прошлом работал с php + MySQL. Думаю, что для желаемой должности учить дополнительно что-то про ДБ нет смысла (попасть на желаемую СУБД трудно, а SQL одинаков), есть куча более необходимых на сейчас вопросов. MySQL и так знаю + поселилась она на моем компе давно и основательно. Потому и выбрал.

А перейти на другую СУБД можно всегда - поменять драйвер и, возможно, почитать один класс (а, возможно, и так заработает).
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Shklyar
Дата 8.9.2008, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(garbuz @ 7.9.2008,  23:10)
Shklyar, супер! Все работает! Завтра получше потыкаюсь и постараюсь написать конаструктив smile Молодец!  smile 

ЗЫ. А можно исходники сюда выложить? ну или хотя бы в приват? smile 

ЗЫЫ. Кстать mysql-connector есть версия поновее, 5 с чем-то smile

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

2. Да. Только, когда я заканчивал с гуи, то начался такой код, что стыдно показывать. Вообще, то и по началу много всякого стыдного, но концовка...

3. Наверно. Нашел библиотеку на своем компе (с тех времен, когда смотрел Студенческий отдел кадров).

Добавлено через 1 минуту и 31 секунду
Цитата(garbuz @ 7.9.2008,  23:25)
Нашел небольшой косяк. 
Когда открыт канал, жмакаем на кнопку редактировать, изменяем имя канала, жмем окей, а потом снова открыть, открывается вторая вкладка с таким же содержимым как и первая, только с другим именем, причем в списке каналов, только один.

Косяк. Но перед его исправлением нужно подумать про структуру программки (как красиво связать закладки, их модели и список и его модель). Как я писал выше они связаны совпадающими индексами (сразу понимал, что идея хлипкая) и под конец гуи начал это чувствовать.
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
SoulKeeper
Дата 8.9.2008, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

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



Цитата(Shklyar @  8.9.2008,  01:03 Найти цитируемый пост)
Тут вопрос кроется во мне. Просто я стремлюсь стать junior Java developer (в этом и есть цель этой программки - опыт, посмотрите по вопросам: xml + db + http + gui ++), а в прошлом работал с php + MySQL. Думаю, что для желаемой должности учить дополнительно что-то про ДБ нет смысла (попасть на желаемую СУБД трудно, а SQL одинаков),


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

Цитата(Shklyar @  8.9.2008,  01:03 Найти цитируемый пост)
 есть куча более необходимых на сейчас вопросов. MySQL и так знаю + поселилась она на моем компе давно и основательно. Потому и выбрал.


Один с необходимых навыков программисат - умение принимать оптимальные\правильные решения. MySQL в данном случае к ним не относится ;)
PM MAIL   Вверх
Platon
Дата 8.9.2008, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(SoulKeeper @  8.9.2008,  09:59 Найти цитируемый пост)
GUI на джаве мало где делают, а вот вебом занимаются активно.

Да это правда. Я - белая ворона в этом сообществе :( 
К сожалению, я не предприниматель, чтоб продвигать Java GUI, да и надо ли? Есть технология, которая предлагает готовое решение и популярна в сфере десктоп приложений (не Java)

Не знаю радоваться ли расстраиваться твоему решению писать GUI на Java...

...

Добавлено через 10 минут и 29 секунд
А так посмотрел, всё тип-топ. Для полноценного RSSClient не хватает малости - нормального HTML Renderer.

Добавлено через 12 минут и 22 секунды
И мои фиды обижает :( http://yanaidu.ru/jobs/feed

Это сообщение отредактировал(а) Platon - 8.9.2008, 09:16
PM MAIL ICQ   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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