powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / swing JTable. отображать и получать объекты @Entity
3 сообщений из 3, страница 1 из 1
swing JTable. отображать и получать объекты @Entity
    #38917007
Николаха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго! Проблем с компонентами не возникает, но вот такой случай возник!
Естественно работаю с данными из БД и их надо как то отобразить и редактировать. Для этого есть компонент JTable. Можно конечно взять и отобразить в нём все колонки (атрибуты Entity класса вместе с Id) но это как то не красиво!
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "user_id")
    private Integer userId;
    @Basic(optional = false)
    @Column(name = "login")
    private String login;
    @Basic(optional = false)
    @Column(name = "passw")
    private String passw;
    @Basic(optional = false)
    @Column(name = "fam")
    private String fam;
    @Basic(optional = false)
    @Column(name = "im")
    private String im;
    @Basic(optional = false)
    @Column(name = "ot")
    private String ot;
    @Column(name = "phone")
    private String phone;
    @Column(name = "email")
    private String email;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
    private List<Process> processList;
    @JoinColumn(name = "role_id", referencedColumnName = "role_id")
    @ManyToOne(optional = false)
    private Role role;



я только умею заполнять таблицу вот так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
        jTable1.removeAll();
        Vector columns = new Vector();
        columns.add("ИД");
        columns.add("Логин");
        columns.add("ФИО");
        columns.add("Телефон");
        columns.add("Эл.почта");
        columns.add("Должность");
        
        Vector dataSource = new Vector();
        for(int i=0;i<userList.size();i++) {
            User user = userList.get(i);
            Vector row = new Vector();
            row.add(user.getUserId());
            row.add(user.getLogin());
            row.add(user.getFam()+" "+user.getIm()+" "+user.getOt());
            row.add(user.getPhone());
            row.add(user.getEmail());
            row.add(user.getRole().getNameRole());
            
            dataSource.add(row);
        }
        DefaultTableModel dTableModel = new DefaultTableModel(dataSource,columns);
        jTable1.setModel(dTableModel);



А как можно и можно ли вообще хранить вместе с userId, но не отображать его в таблице, при клике на строке получать и обрабатывать уже сам User???

В jComboBox-е это вот так делается:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
..........
        jComboBox1.removeAllItems();
        RoleDAO<Role> roleDAO = new RoleDAOImpl();
        List<Role> roles = new ArrayList<Role>();
        roles = roleDAO.getAllRole();
        roleDAO.close();
        for(Role r : roles) {
            jComboBox1.addItem(r);
        }
        jComboBox1.setSelectedIndex(0);
        jComboBox1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JComboBox cb = (JComboBox)e.getSource();
                Role str = (Role)cb.getSelectedItem();
                System.out.println("ActionListener: "+str.getRoleId()); //тут я получаю Role и что-нибудь делаю
            }
        });
............

//вот сам Role
public class Role implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "role_id")
    private Integer roleId;
    @Basic(optional = false)
    @Column(name = "name_role")
    private String nameRole;
    @Column(name = "descr")
    private String descr;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "role")
    private List<User> userList;
    ...................
    //гетеры и сетеры
    ...................
    @Override
    public String toString() {
        return nameRole;  //тут надо именно так прописать
    }
...
Рейтинг: 0 / 0
swing JTable. отображать и получать объекты @Entity
    #38917315
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
От себя хочу заметить: использовать ORM сущности в качестве модели для UI, в целом не лучшее решение. Для простых задач - ОК. Сложные ERP UI требуют отдельной модели адаптированной под клиента. Сущности лучше оставить на сервере. На то есть ряд причин.

Самое подходящее решение для подобных задач - биндиг и паттерн MVVM. Но swing-овый биндинг (better bean binding) натянуть на таблицу у моих коллег не вышло. Самому мне некогда было вникать в причины, поэтому мы реализовали другой подход. Нужно разобраться в архитектуре Swing - Model, Component, Event и полноценно их использовать.

В итоге будет что-то типа

Код: java
1.
2.
3.
4.
public class EntityTableModel extends AbstractTableModel{
         List<Serializable> entities; //Вообще для сущностей хорошо бы иметь отдельный интерфейс. Туда можно, например запихать свойство для id.
         //Здесь нужно переопределить методы, которые возвращают число строк, колонок и читают значения из свойств.
}



Для того чтобы замапить конкретную сущность EntityTableModel использует интерфейсы, которые из сущности умеют получать данные по номеру колонки и имена колонок.

Ну, и самый волнующий вопрос - почему же не JavaFX?
...
Рейтинг: 0 / 0
swing JTable. отображать и получать объекты @Entity
    #38917405
Николаха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,Спасибо, помогло!

Так сказать дали толчок в нужном направлении и вопрос решен!

Не знаю как объяснить, но swing показался мне тогда привлекательней, хотя опыт на JavaFX есть, не сказать что большой, но и не маленький.
Да, согласен, в JavaFX биндинг очень удобен, благодаря ему не надо городить лишний код и что то там выдумывать! Я сейчас не помню, но по-моему у меня там возникали проблемы при работе с компонентами, точно не могу сказать какие, уже забыл! Может быть в новых версиях стало попроще!? Надо попробовать снова использовать JavaFX!!! ))))
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / swing JTable. отображать и получать объекты @Entity
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]