2013-01-19 46 views
2

是否可以一次更新JTable整行,而不是列? 這是我下面 程序目前我能修改只 使用是否可以立即更新JTable整行?

model.setValueAt("1111", 0, 0) 

我能使用

model.setValueAt(new Object[]{"1111","Pavan","Developer"}, 0, 0); 


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

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 Preethi { 
    protected void initUI() { 
     final DefaultTableModel model = new DefaultTableModel(new String[] { 
       "Id", "Name", "Desg" }, 0); 
     final JTable table = new JTable(model); 
     // table.setFillsViewportHeight(true); 
     JFrame frame = new JFrame(Preethi.class.getSimpleName()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JScrollPane scrollpane = new JScrollPane(table); 
     frame.add(scrollpane, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setVisible(true); 
     Vector vec = new Vector(); 
     vec.add("1122"); 
     vec.add("Iraneee"); 
     vec.add("Dev"); 
     model.insertRow(0, vec); 
     model.setValueAt("1111", 0, 0); 
     //model.setValueAt(new Object[]{"1111","Pavan","Developer"}, 0, 0); 

    } 

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

} 
+0

_Update entire row_。所以我認爲刪除該行並添加新行。 – Amarnath

回答

3

docs所示,setValueAt設置單個單元格值。

設置單元格在列和行處的對象值。 aValue是新的價值。

但是,你可以超載的方法來處理Object陣列:

class MyTableModel extends DefaultTableModel { 

    public MyTableModel(Object[] columnNames, int rowCount) { 
     super(columnNames, rowCount); 
    } 

    public void setValueAt(Object[] valueArray, int row) { 
     int column = 0; 
     for (Object cellValue: valueArray) { 
     setValueAt(cellValue, row, column); 
     column++; 
     } 
    } 
} 

使用這個模型,你就那麼能爲一個給定的行設置的值:

model.setValueAt(new Object[] { "1111", "Pavan", "Developer" }, 0); 

稍微短版本:

class MyTableModel extends DefaultTableModel { 

    public MyTableModel(Object[] columnNames, int rowCount) { 
     super(columnNames, rowCount); 
    } 

    public void setValueAt(Object[] valueArray, int row) { 

     getDataVector().setElementAt(new Vector(Arrays.asList(valueArray)), row);  
    } 
} 
+2

使用'getDataVector()。setValueAt()'然後調用'fireTableRowsUpdated'會更有效率。 –

+0

感謝Reimeus,那工作。 – Pawan

+0

@GuillaumePolet我已經使用'getDataVector'添加了表模型,但'JTable'更新_without_不會調用fireTableRowsUpdated。 – Reimeus

1

是否有可能一次更新JTable中整個行逐列,而比 列明智?

由於您不想遍歷整行。我建議您刪除該特定行,然後使用addRow方法添加具有更新值的新行。

OR

如果表中的每一行都是一個Object,那麼你可以得到表使用列表,然後從列表中刪除,並添加新的對象添加到列表。

+0

謝謝Che,第一種方法看起來不錯,但我想這會是一次沉重的操作。 – Pawan

+0

@PreethiJain是的,你說得對。這只是一個建議。由於_Guillaume Polet_和_Reimeus_建議** getDataVector()。setValueAt()**會很好。 +1爲今天學到的東西的問題。 – Amarnath