2012-09-27 154 views
3

我已經設置JTable與分頁 - 這工作得很好,但我有更新數據到表的問題。 table.repaint()不起作用。這是我正在使用的代碼。提前致謝!Jtable/JScrollPanel不會刷新(更新數據)

String[][] data = new String[100][4]; 

String[] columnNames = new String[]{ 
     "IP", "PC_NAME", "ttl", "db"}; 

構造:

gui(){ 
    JTable table = new JTable(data, columnNames); 
    JScrollPane scrollPane = new JScrollPane(table); 
    JButton next = new JButton("next"); 
    JButton prev = new JButton("prev"); 
    next.addActionListener(this); 
    prev.addActionListener(this); 
    JPanel panel = new JPanel(new BorderLayout()); 
    JPanel buttonPanel = new JPanel(); 
    buttonPanel.add(prev); 
    buttonPanel.add(next); 
    panel.add(buttonPanel, BorderLayout.SOUTH); 
    panel.add(table.getTableHeader(), BorderLayout.PAGE_START); 
    panel.add(scrollPane, BorderLayout.CENTER); 
    getContentPane().add(panel);} 

的ActionListener:

public void actionPerformed(ActionEvent e) { 
if (e.getActionCommand() == "next") { 
    Rectangle rect = scrollPane.getVisibleRect(); 
    JScrollBar bar = scrollPane.getVerticalScrollBar(); 
    int blockIncr = scrollPane.getViewport().getViewRect().height; 
    bar.setValue(bar.getValue() + blockIncr); 
    scrollPane.scrollRectToVisible(rect); 
} 
if (e.getActionCommand() == "prev") { 
    Rectangle rect = scrollPane.getVisibleRect(); 
    JScrollBar bar = scrollPane.getVerticalScrollBar(); 
    int blockIncr = scrollPane.getViewport().getViewRect().height; 
    bar.setValue(bar.getValue() - blockIncr); 
    scrollPane.scrollRectToVisible(rect); 
}} 

下面是一個數據存儲到一個數組的函數:

int i=0; 
public void WriteMonitorData (String IP, String PC_NAME, String ttl, String gw) 
{ 
    data[i][0]=IP; 
    data[i][1]=PC_NAME; 
    data[i][2]=ttl; 
    data[i][3]=gw; 
    i++; 
    table.repaint(); 
    scrollPane.repaint(); 

} 

編輯1:

我用DefaultTableModel試過,仍然沒有運氣。這是我用來更新表的代碼。 構造函數代碼沒有改變。 聲明:

private static final long serialVersionUID = 1L; 
String[][] data = new String[100][4]; 

String[] columnNames = new String[]{ 
     "IP", "PC_NAME", "ttl", "db"}; 



      DefaultTableModel model = new DefaultTableModel(data,columnNames); 
    JTable table = new JTable(model); 
    JScrollPane scrollPane = new JScrollPane(table); 

這裏是功能更新表:

public void WriteMonitorData (String IP, String PC_NAME, String ttl, String gw) 
{ 

    System.out.println(IP); 
    model.setValueAt(IP, i, 0); 
    model.setValueAt(PC_NAME, i, 1); 
    model.setValueAt(ttl, i, 2); 
    model.setValueAt(gw, i, 3); 
    i++; 
    model.fireTableDataChanged(); 
    table.repaint(); 
    scrollPane.repaint(); 

} 
+0

請清理你的代碼縮進。同一塊上的所有代碼應該統一縮進(我自己喜歡3個空格)。如果你不這樣做,那麼你就比讓志願者審查和理解你的代碼更加困難,這對我們來說確實不公平。 –

+0

也請花一點時間,並描述你的問題的細節。我們當然不能運行這個代碼片段,所以如果你沒有發佈可編譯代碼,你需要給我們足夠的信息,以便我們能夠合理猜測問題的根源。這將需要**你**提供的信息。 –

+0

我有其他類調用函數WriteMonitorData並傳遞4個字符串。當函數WriteMonitorData被調用時,我將傳遞的字符串存儲到包含表的數據的變量數據中。問題是表數據不刷新。我成功地將傳遞的字符串存儲到變量數據中,但由於某些原因,表格行是空的 – ZhiZha

回答

3

你的問題是,你比較字符串與==。改爲使用equals(...)方法。

  • ==比較兩個變量是否指向相同的對象 - 您不關心的東西。因此,兩個字符串變量可以保持相同的字,但不能被這個操作視爲相等。
  • equals(...)equalsIgnoreCase(...)方法檢查兩個字符串變量是否保持相同的字符在相同的順序,並且你關心。

所以沒有:

if (e.getActionCommand() == "next") { 
    // ... 
} 

而是:

if ("next".equals(e.getActionCommand())) { 
    // ... 
} 

,或者如果你不關心情況:

if ("next".equalsIgnoreCase(e.getActionCommand())) { 
    // ... 
} 

編輯1
ñ ext,一旦你的JTable擁有了數據,改變數據可能對JTable沒有影響。所以在這裏你改變數據數組:

int i=0; 
public void WriteMonitorData (String IP, String PC_NAME, String ttl, String gw) 
{ 
    data[i][0]=IP; 
    data[i][1]=PC_NAME; 
    data[i][2]=ttl; 
    data[i][3]=gw; 
    i++; 
    table.repaint(); 
    scrollPane.repaint(); 

} 

但這陣列已經被傳遞到JTable的,現在是它的模型的一部分,並在所有的可能性已經變成一個載體。

要查看數據的JTable中的表現的變化,你必須改變由表的模型保存的數據。我建議您使用DefaultTableModel將數據保存在JTable中,然後在上面的方法中(應該以小寫字母開頭)更改模型保存的數據。

此外,無論您的if塊是否可用,都不要使用==來比較字符串,因爲這會立即引起您的注意。

+0

ActionListener工作正常。有沒有問題 – ZhiZha

+0

@ user1336646:那麼請告訴我們什麼*不是*工作正常。細節*非常重要。 –

+0

動作偵聽器工作正常。問題是表數據不刷新/更新... – ZhiZha