Wyswietlanie danych z bazy wględem godziny

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();
		
		}
	}
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

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?

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/wiki/en/development/strategy-api/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/tuxmonteiro/AlgoSmartJForex/blob/master/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/Tutorial/Java/0240__Swing/Settablevalue.htm - m.in. tutaj jest przykład jak robić update komórek

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