Как автоматически обновлять SWING GUI при любых изменениях базы данных

У меня есть страница (Swing GUI), где я показываю данные в соответствии с некоторым условием. Когда страница загружается, страница извлекает данные из БД и отображает данные в графическом интерфейсе. Теперь, если в базе данных есть какие-либо изменения, я хочу, чтобы это изменение немедленно отразилось в моем графическом интерфейсе без запуска / перезагрузки / обновления. Есть идеи, как реализовать эту функциональность. Я использую соединение JDBC ... Пожалуйста, предложите ... Примечание: я не хочу запускать java-код или обновлять страницу, данные должны обновляться автоматически. Заранее спасибо,

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Timer;``
import java.util.TimerTask;

import javax.swing.*;

import DemoDBConn.MysqlConnection;
@SuppressWarnings("serial")
class GUI extends JFrame
{

Connection connection=null;
    public GUI()
    {
        JFrame jf = new JFrame();       
        JLayeredPane LPane = new JLayeredPane();
        jf.getContentPane() .add(LPane);
        ImageIcon i = new ImageIcon(GUI.class.getResource("/images/background4.gif"));

        JLabel background = new JLabel();
        background.setIcon(i);
        background.setBounds(0, 0, 1024, 768);

        JLabel flight = new JLabel();
        flight.setIcon(new ImageIcon(GUI.class.getResource("/images/acs_md_dis.png")));
        flight.setBounds(270, 0, 800, 768);

        JLabel seat1 = new JLabel();
        seat1.setIcon(new ImageIcon(GUI.class.getResource("/images/acSymAmberInd.png")));
        seat1.setBounds(320, 230, 10, 20);

        JLabel seat2 = new JLabel();
        seat2.setIcon(new ImageIcon(GUI.class.getResource("/images/acSymAmberInd.png")));
        seat2.setBounds(370, 230, 10, 20);

        JLabel seat3 = new JLabel();
        seat3.setIcon(new ImageIcon(GUI.class.getResource("/images/acSymAmberInd.png")));
        seat3.setBounds(320, 280, 10, 20);

        JLabel seat4 = new JLabel();
        seat4.setIcon(new ImageIcon(GUI.class.getResource("/images/acSymAmberInd.png")));
        seat4.setBounds(370, 280, 10, 20);


        LPane.add(background, new Integer(1));
        LPane.add(flight, new Integer(2));
        LPane.add(seat1, new Integer(3));
        LPane.add(seat2, new Integer(3));
        LPane.add(seat3, new Integer(3));
        LPane.add(seat4, new Integer(3));




    try {
        String query  = "Select * from passengersdetails";
        connection = MysqlConnection.dbConnector();
        PreparedStatement pst= connection.prepareStatement(query);
        ResultSet rs= pst.executeQuery();
        while(rs.next()){
            if (rs.getString("seateNumber").equals("A1")){
                if (rs.getString("status").equals("OK")){
                    seat1.setIcon(new ImageIcon(
                            GUI.class.getResource("/images/acSymGreenInd.png")));
                }
                else if (rs.getString("status").equals("NOT OK")){

                }
                else{

                }
            }
            else if (rs.getString("seateNumber").equals("A2")){

                if (rs.getString("status").equals("OK")){
                    seat2.setIcon(new ImageIcon(
                            GUI.class.getResource("/images/acSymGreenInd.png")));
                }
                else if (rs.getString("status").equals("NOT OK")){

                }
                else{

                }
            }
            else if (rs.getString("seateNumber").equals("A3")){
                if (rs.getString("status").equals("OK")){
                    seat3.setIcon(new ImageIcon(
                            GUI.class.getResource("/images/acSymGreenInd.png")));
                }
                else if (rs.getString("status").equals("NOT OK")){

                }
                else{

                }
            }
           else if (rs.getString("seateNumber").equals("A4")){
               if (rs.getString("status").equals("OK")){
                    seat4.setIcon(new ImageIcon(
                            GUI.class.getResource("/images/acSymGreenInd.png")));
                }
                else if (rs.getString("status").equals("NOT OK")){

                }
                else{

                }
            }   

        }
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);
    jf.setSize(1024,768);
    jf.setResizable(false);     
    jf.setVisible(true);
    }

    public static void main(String args[])
    {
        GUI gui = new GUI();



    }
} 

Я не думаю, что JDBC поддерживает это. Что вы могли бы попробовать, так это написать код вокруг базы данных на «серверной» стороне. Затем используйте Шаблон проектирования наблюдателя для пересылки изменений в графический интерфейс.

S.L. Barth 26.09.2018 13:13

И как вы планируете заставить «серверную часть» вести себя как «наблюдаемая» часть шаблона? Или как это выглядит, «имея код около в базе данных»?

Erwin Smout 26.09.2018 13:15

@ErwinSmout Код будет обертывать базу данных. По-прежнему необходимо будет регулярно опрашивать базу данных, если только СУБД не имеет механизмов для оповещения об изменениях во внешнем мире. По сути, этот код работает как Модель, а графический интерфейс - как Представление.

S.L. Barth 26.09.2018 13:18

Укажите минимальный проверяемый код.

Code_Ninja 26.09.2018 13:20

@ErwinSmout а таймер ..?

shailendra 26.09.2018 13:22

«не хочу запускать Java-код» и «не хочу обновлять страницу». Вы знаете, как влияет "регулярный опрос" на загрузку системы? Что касается: «сигнализировать об изменении внешнего мира»: ни один из поставщиков SQL не знает, как это сделать (и, во всяком случае, насколько мне известно, в JDBC API нет ничего, что нацелено на поддержку такого рода вещей).

Erwin Smout 26.09.2018 13:23

"таймер" конфликтует с [что я понял из] "не хочу обновлять страницу". Повторение запроса с запуском по времени - это то же самое, что и обновление. И, в любом случае, механизм SQL вряд ли будет продолжать работать нормально после того, как нагрузка начнет накапливаться.

Erwin Smout 26.09.2018 13:25

@ErwinSmout, так есть ли другой способ сделать это ... ??

shailendra 26.09.2018 13:33

Вежливо предлагаю вам внимательно обдумать более глубокий смысл первых двух слов моего ответа.

Erwin Smout 26.09.2018 14:07

Хотя Swing менее важен для этого, чем добавленные вместо него теги, связанные с БД, я дам вам один совет, прежде чем отказаться. Графические интерфейсы Java должны работать с разными ОС, размером экрана, разрешением экрана и т. д., Используя разные PLAF в разных регионах. Таким образом, они не способствуют созданию идеального пиксельного макета. Вместо этого используйте менеджеры компоновки или их комбинации вместе с отступом компоновки и границами для белое пространство.

Andrew Thompson 26.09.2018 14:11

Спасибо за весь приведенный выше ответ. Теперь я могу сделать это с помощью таймера Java.

shailendra 27.09.2018 09:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
11
254
1

Ответы 1

Перестань мечтать.

Механизмы СУБД существуют для того, чтобы отвечать на вопросы (запросы) по принципу «один вопрос - один ответ». Ответили на вопрос? Работа сделана. Вот как это работает. Они не существуют, чтобы отслеживать, какой пользователь задал какой вопрос, и хотят получать уведомления всякий раз, когда на данный ответ на вопрос влияет какое-либо другое обновление базы данных, выполненное кем-либо еще.

Фактически, если ваш запрос представляет собой полноценное реляционное выражение, включающее различные операторы реляционной алгебры, не существует даже какого-либо механизма, который знал бы, как вычислить этот материал [достаточно эффективно, чтобы вся машина не сразу перешла к измельчению остановить все необходимые вычисления].

Другие вопросы по теме