2013-01-18 19 views
1

我有一個需求,我需要顯示Streaming Data,比如從網格中的第三方服務器回收的股票報價符號的Bid,Ask,Last,Change值。Swing:用於顯示文本的組件Streaming Data

爲此,我可以使用Jtable作爲數據將chnaging不斷?? ??

請分享您的看法,提前致謝

回答

3

是的,爲什麼不使用JTable的事。我想在某些時候你必須在你的TableModel上創建一個SlidingWindow以避免過多的數據。

這裏是一個小的演示示例,說明這樣做(在RandomTimer只是有模擬輸入數據)的一種方法:

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Date; 
import java.util.Random; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.DefaultTableModel; 

public class TestStreamingDataTable { 

    protected void initUI() { 
     final Random random = new Random(); 
     final DefaultTableModel model = new DefaultTableModel(new String[] { "Bid", "Ask", "Last", "Change values", "Time" }, 0); 
     final JTable table = new JTable(model); 
     table.setFillsViewportHeight(true); 
     JFrame frame = new JFrame(TestStreamingDataTable.class.getSimpleName()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JScrollPane scrollpane = new JScrollPane(table); 
     frame.add(scrollpane, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setVisible(true); 
     Timer t = new Timer(1000, new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       model.insertRow(0, new Object[] { random.nextInt(1000), random.nextInt(1000), random.nextInt(1000), random.nextInt(1000), 
         new Date() }); 
      } 
     }); 
     t.start(); 
    } 

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, 
      UnsupportedLookAndFeelException { 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TestStreamingDataTable().initUI(); 
      } 
     }); 
    } 

} 
+0

偉大的回答,非常感謝波萊。我的要求是,而不是插入一個新的行,是否有可能更新行? – Pawan

+0

@PreethiJain你總是可以使用'setValueAt()',但你必須逐個單元格地完成它。你最好使用自己的表模型類來擴展'AbstractTableModel',它實現'TableModel'的所有方法,並且有一些額外的方法可以同時更新一行或多行。那些方法需要調用由'AbstractTableModel'提供的適當的fireTableXXX方法。 –

+0

非常感謝,我可以用setValueAt來管理。再次感謝 。 – Pawan

相關問題