Wyswietlanie danych z bazy wględem godziny

Odpowiedz Nowy wątek
2019-08-28 11:35
0

Podstawą tego modułu jest wyświetlanie co jakiś czas np. 20s lotów odbywających się o danej godzinie w tabeli. Dane mają te być cały czas aktualizowane czyli pojawiać się i znikać.

Połączenie z bazą jest, tabela też wyświetla, ale problem jest w tym, że po każdym przejściu pętli tabela odsuwa się w prawo i po lewej stronie wyświetla się jakby kolejny pusty panel. Próbowałem juz nawet czyszczenia tabeli.

Jak więc radzicie to zrobić podejśc do tego ?

CODE:

public class PopulateTablewitchFlyData {

    static JFrame f = new JFrame("All actual fly");
    static JScrollPane scroll = new JScrollPane();//tab
    static JTable tab = new JTable();
    static DefaultTableModel dtm = new DefaultTableModel();

    //Part where is creata a table 
    public void createTable()
    {

        f.setBounds(200,200,400,300);
        f.setVisible(true);
    }

public void getTable() throws Exception
    {
        int x = 1;
        String actualDate = "2019-05-21 10:00:00s";
        JFrame frame = new JFrame("Actual Fly Connections");
        JTable tab = new JTable();
        DefaultTableModel dtm = new DefaultTableModel();

        while(x > 0)
        {
            Class.forName("com.mysql.jdbc.Driver");
            Connection connect = DriverManager.getConnection("jdbc:mysql://localhost/baza_lotow","root","");

            Statement st = connect.createStatement();
            ResultSet rs2 = st.executeQuery("select * from przyloty where data_i_godzina_przylotu >= '"+actualDate+"' ORDER BY data_i_godzina_przylotu limit 2 ");

            ResultSetMetaData rsmd = rs2.getMetaData();

            int columns = rsmd.getColumnCount();
            String col[] = new String[columns];

            //Get data from columns
            for(int i=0;i < columns; i++)
            {
                col[i] = rsmd.getColumnName(i+1);
                dtm.addColumn(col[i]);
            }

            Object rows[] = new Object[columns];
            while(rs2.next())
            {
                for(int a=0; a < columns; a++)
                {
                    rows[a] = rs2.getString(a+1);
                }
                dtm.addRow(rows);
            }

            tab.setModel(dtm);

            JScrollPane scroll = new JScrollPane(tab);
            frame.add(scroll);

            frame.setBounds(200,200,400,300);
            frame.setVisible(true);

            //dtm.fireTableDataChanged();

            connect.close();

            //Sleep appplication on 20 min
            TimeUnit.SECONDS.sleep(10);
        }

    }

    public static void close() {
        Connection connect = null;
        Statement statement = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {

            if (resultSet != null) {
                resultSet.close();
            }

            if (statement != null) {
                statement.close();
            }

            if (connect != null) {
                connect.close();
            }
        } catch (Exception e) {

        }
    }

    public static void main(String[] args) throws Exception{

        PopulateTablewitchFlyData populate = new PopulateTablewitchFlyData();
        populate.getTable();

        }
    }

:)
edytowany 1x, ostatnio: Koziołek, 2019-08-28 20:45
Dla mnie wszystko na NIE. Od nazw metod (żadna nie robi tego, jak się nazywa), statiki, przez deklaracje zmiennych w close(). Wklejałeś z kilku niezależnych kwerend googla? - AnyKtokolwiek 2019-08-28 12:03
Poczytaj co jet table model w Swingu, odnawiający się okresowo model to lekarstwo na twój problem - AnyKtokolwiek 2019-08-28 12:04

Pozostało 580 znaków

2019-08-28 20:50
0

Po pierwsze co robi ten kod:

  JScrollPane scroll = new JScrollPane(tab);
            frame.add(scroll);

            frame.setBounds(200,200,400,300);
            frame.setVisible(true);

Po drugie TableModel twoim przyjacielem.

Po trzecie do zarządzania rzeczami cyklicznymi używaj ScheduledExecutorService

Pozostało 580 znaków

2019-08-28 21:42
0
delform_17 napisał(a):
public static void close() {
       Connection connect = null;
       Statement statement = null;
       PreparedStatement preparedStatement = null;
       ResultSet resultSet = null;
       try {

          if (resultSet != null) {
              resultSet.close();
           }

           if (statement != null) {
               statement.close();
           }

           if (connect != null) {
               connect.close();
           }
       } catch (Exception e) {

       }
   }

O co tu chodzi? Po co są te ify?

Pozostało 580 znaków

2019-08-28 22:08
0
delform_17 napisał(a):

Połączenie z bazą jest, tabela też wyświetla, ale problem jest w tym, że po każdym przejściu pętli tabela odsuwa się w prawo i po lewej stronie wyświetla się jakby kolejny pusty panel. Próbowałem juz nawet czyszczenia tabeli....

To jest zapewne wina tego że tworzysz nowe wiersze i kolumny w pętli. Linia 41 dtm.addColumn(col[i]) oraz linia 51 dtm.addRow(rows) . W ogóle nie widzę tutaj metody setValueAt . Nie wiem jak to wytłumaczyć, ale też na początku korzystania z TableModel miałem źle zrobioną aktualizację komórek, kasowałem całą tabelę i źle używałem setValueAt, przez co renderowanie szwankowało. Tabela migała. Zobacz sobie jak jest zrobiona klasa OrderTableModel tutaj https://www.dukascopy.com/wik[...]/practices/order-update-table i funkcje getValueAt oraz setValueAt. Z tym powinieneś pokombinować raczej. A co do aktualizacji okresowej. Moim zdaniem wystarczy zrobić zwykły "counter", czyli private static int counter = 0; jako globalna zmienna, a w pętli zrobić Thread.sleep(1000) który jest usypiany co 1 sekundę i w tym dodawanie 1 (inkrementację co 1) do countera. I sprawdzanie warunku if (counter == (60 * 20)) czyli jeśli counter jest równy 1200 sekund, czyli 20 minut wtedy zrób update tabeli. Ciężko mi coś podpowiedzieć, ale ja rozkminiałem to właśnie na tej aplikacji jforex i tym wiki oraz z tego kodu https://github.com/tuxmonteir[...]examples/myOfflineTrades.java

// edit - Sorry, co 20 sekund, czyli `if (counter == 20) { /* wykonaj jakiś kod i zresetuj counter / counter = 0 }

// edit - http://www.java2s.com/Tutoria[...]0240__Swing/Settablevalue.htm - m.in. tutaj jest przykład jak robić update komórek

edytowany 3x, ostatnio: goose_, 2019-08-29 04:34
http://www.java2s.com/Tutoria[...]0240__Swing/Settablevalue.htm - m.in. tutaj jest taki przykład jak robić update komórek - goose_ 2019-08-29 04:28

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0