У меня есть страница (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();
}
}
И как вы планируете заставить «серверную часть» вести себя как «наблюдаемая» часть шаблона? Или как это выглядит, «имея код около в базе данных»?
@ErwinSmout Код будет обертывать базу данных. По-прежнему необходимо будет регулярно опрашивать базу данных, если только СУБД не имеет механизмов для оповещения об изменениях во внешнем мире. По сути, этот код работает как Модель, а графический интерфейс - как Представление.
Укажите минимальный проверяемый код.
@ErwinSmout а таймер ..?
«не хочу запускать Java-код» и «не хочу обновлять страницу». Вы знаете, как влияет "регулярный опрос" на загрузку системы? Что касается: «сигнализировать об изменении внешнего мира»: ни один из поставщиков SQL не знает, как это сделать (и, во всяком случае, насколько мне известно, в JDBC API нет ничего, что нацелено на поддержку такого рода вещей).
"таймер" конфликтует с [что я понял из] "не хочу обновлять страницу". Повторение запроса с запуском по времени - это то же самое, что и обновление. И, в любом случае, механизм SQL вряд ли будет продолжать работать нормально после того, как нагрузка начнет накапливаться.
@ErwinSmout, так есть ли другой способ сделать это ... ??
Вежливо предлагаю вам внимательно обдумать более глубокий смысл первых двух слов моего ответа.
Хотя Swing менее важен для этого, чем добавленные вместо него теги, связанные с БД, я дам вам один совет, прежде чем отказаться. Графические интерфейсы Java должны работать с разными ОС, размером экрана, разрешением экрана и т. д., Используя разные PLAF в разных регионах. Таким образом, они не способствуют созданию идеального пиксельного макета. Вместо этого используйте менеджеры компоновки или их комбинации вместе с отступом компоновки и границами для белое пространство.
Спасибо за весь приведенный выше ответ. Теперь я могу сделать это с помощью таймера Java.
Перестань мечтать.
Механизмы СУБД существуют для того, чтобы отвечать на вопросы (запросы) по принципу «один вопрос - один ответ». Ответили на вопрос? Работа сделана. Вот как это работает. Они не существуют, чтобы отслеживать, какой пользователь задал какой вопрос, и хотят получать уведомления всякий раз, когда на данный ответ на вопрос влияет какое-либо другое обновление базы данных, выполненное кем-либо еще.
Фактически, если ваш запрос представляет собой полноценное реляционное выражение, включающее различные операторы реляционной алгебры, не существует даже какого-либо механизма, который знал бы, как вычислить этот материал [достаточно эффективно, чтобы вся машина не сразу перешла к измельчению остановить все необходимые вычисления].
Я не думаю, что JDBC поддерживает это. Что вы могли бы попробовать, так это написать код вокруг базы данных на «серверной» стороне. Затем используйте Шаблон проектирования наблюдателя для пересылки изменений в графический интерфейс.