2011-11-05 46 views
0

我正在開發一個帶有swing的java(jdk 1.6)桌面應用程序,但在刷新視圖後出現問題。每當我更新JTable的模型時,我都會發現這個模型中的數據會發生變化,但是視圖中會出現問題。如何刷新JTable模型而不覆蓋視圖中的舊模型?

它只用新數據覆蓋單元格中的舊數據,並模糊單元格中的數據,就好像它將一個數據圖像置於其他數據上一樣。當我雙擊單元格時,我可以讀取新的數據。 (不能不幸張貼圖片)

我試圖

  • 設置數據模型首先爲空,調用重繪(),然後加載新的模型和重繪()
  • 調用fireTableDataChanged()
  • 搜索

毫無效果類似的問題和疑問。我有很多像這樣的桌子,但只有這張桌子有這樣的問題。

要更新底層數據模型:

void loadTask(Task t) { 

    (....)  
    TaskPropertiesModel = new DefaultTableModel(); 
    Object[][] data = new Object[][] 
      { 
       {"Start :", t.getStart()}, 
       {"End :", t.getEnd()}, 
       {"Freq. :", t.getFrequency()}, 
       {"Roles :", roles}, 
       {"Hard :", t.getHard()}, 
       {"Values:", values}     
      }; 

    TaskPropertiesModel.setDataVector(data, new Object[2]); //no column is shown 
} 

表屬性:

TaskPropertiesTable.setMaximumSize(new java.awt.Dimension(150, 90)); 
    TaskPropertiesTable.setMinimumSize(new java.awt.Dimension(150, 90));   
    TaskPropertiesTable.setRowSelectionAllowed(false); 
    TaskPropertiesTable.getTableHeader().setResizingAllowed(false); 
    TaskPropertiesTable.getTableHeader().setReorderingAllowed(false);   
    TaskPropertiesTable.setTableHeader(null);   
    TaskPropertiesTable.setPreferredScrollableViewportSize(TaskPropertiesTable.getPreferredSize()); 

    TaskPropertiesTable.setModel(new javax.swing.table.DefaultTableModel(
     new Object [6][2],new String [2])); 
    TaskPropertiesTable.setDefaultRenderer(Object.class, new MultiLineCellRenderer()); 

MultiLineCellRenderer:

public class MultiLineCellRenderer extends JTextArea implements TableCellRenderer { 

public MultiLineCellRenderer() { 
setLineWrap(true); 
setWrapStyleWord(true); 
setOpaque(true); 
} 

public Component getTableCellRendererComponent(JTable table, Object value, 
    boolean isSelected, boolean hasFocus, int row, int column) {  

if (isSelected) { 
    setForeground(Color.BLACK); 
    setBackground(Color.LIGHT_GRAY); 
} 
else { 
    setForeground(Color.BLACK); 
    setBackground(Color.WHITE); 
} 
setFont(table.getFont()); 

if (hasFocus) {  
    setBorder(new FocusBorder(Color.RED, Color.RED)); 
    if (table.isCellEditable(row, column)) { 
     setForeground(Color.BLACK); 
     setBackground(Color.LIGHT_GRAY); 
    } 
} else { 
    setBorder(new BevelBorder(1)); // This was emptyBorder. 
            //after changing it, the problem is solved 
} 

if (!table.isCellEditable(row, column)) { 
     setForeground(Color.BLACK); 
     setBackground(Color.LIGHT_GRAY); 
    } 

setText((value == null) ? "" : value.toString()); 


//---setting the row height--// 
} 

預先感謝

ISIL

+0

請學習java命名約定,並堅持不懈 – kleopatra

+0

沒有什麼你嘗試過(除了做研究 - 永遠不會傷害:-)是永遠需要的。相反,你所做的代碼出現了問題_not_ show,sscce的時間 – kleopatra

+0

「神奇地」,當我設置單元格邊界時,問題就解決了。 (從EmptyBorder更改爲BevelBorder)還有另一個關於滾動的(類似的)問題。當我在這張桌子上滾動時,單元格上的數據也受到影響,文字模糊。設置邊框後也解決了這個問題。任何意見? – isilpekel

回答

0

我定義的所有表都有同樣的問題。 滾動後,所有呈現爲複選框,組合框,textarea等的單元格變得模糊,直到單獨單擊它們。有一個更新問題。 當相關的TableCellRenderers設置單元格的背景顏色時,問題得到解決。這個「可能」會在問題發生後自動更新單元格。