2012-04-21 86 views
2

我已經設置了單元格編輯器的列是一個JSpinner的之一後,和它的作品,但是當在數據模型中的數據改變我之前啓用編輯器仍然處於啓用狀態河畔它顯示該值形成舊行(它不存在或它在更改後的數據中位於不同的位置)。JTable中cellEditor的停留表中的數據模型的變化

我怎樣才能使選定單元格的編輯器消失保存輸入的數值數據更改時?

+0

爲更好地幫助越早編輯與[SSCCE]你的問題(http://sscce.org/) – mKorbel 2012-04-21 14:59:31

+0

我會嘗試這樣做,但有什麼辦法隱藏單元格編輯器,如jtable.doSomethingWithEditors()?或者我做錯了什麼,數據更改後的單元格應該不可編輯? – user554033 2012-04-21 15:08:18

回答

3

這一個可能是好的代碼爲您SSCCE

enter image description here

import java.awt.*; 
import java.util.EventObject; 
import javax.swing.*; 
import javax.swing.border.*; 
import javax.swing.table.*; 

public class SpinnerColumn extends AbstractCellEditor implements TableCellEditor, TableCellRenderer { 

    private static final long serialVersionUID = 1L; 
    private JSpinner editSpinner, renderSpinner; 
    private JTable table; 
    private String[] list; 
    private Border originalBorder; 

    public SpinnerColumn(JTable table, int column) { 
     editSpinner = new JSpinner(); 
     renderSpinner = new JSpinner(); 
     originalBorder = editSpinner.getBorder(); 
     editSpinner.setBorder(new LineBorder(Color.BLUE)); 
     this.table = table; 
     table.getColumnModel().getColumn(column).setCellEditor(this); 
    } 

    public SpinnerColumn(String[] list, JTable table, int column) { 
     editSpinner = new JSpinner(); 
     editSpinner.setModel(new SpinnerListModel(list)); 
     renderSpinner = new JSpinner(); 
     originalBorder = editSpinner.getBorder(); 
     editSpinner.setBorder(new LineBorder(Color.BLUE)); 
     this.list = list; 
     this.table = table; 
     table.getColumnModel().getColumn(column).setCellEditor(this); 
    } 

    @Override 
    public Object getCellEditorValue() { 
     return editSpinner.getValue(); 
    } 

    @Override 
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, 
      int row, int column) { 
     if (list != null) { 
      editSpinner.setValue(list[0]); 
     } else { 
      editSpinner.setValue(0); 
     } 
     if (value != null) { 
      editSpinner.setValue(value); 
     } 
     return editSpinner; 
    } 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, 
      boolean hasFocus, int row, int column) { 
     if (hasFocus) { 
      renderSpinner.setBorder(new LineBorder(Color.BLUE)); 
     } else { 
      renderSpinner.setBorder(originalBorder); 
     }// *** here's where we set the spinner's value 
     if (value == null) { 
      renderSpinner.setValue(0); 
     } else { 
      int intValue = ((Integer) value).intValue(); 
      renderSpinner.setValue(intValue); 
     } 
     return renderSpinner; 
    } 

    @Override 
    public boolean isCellEditable(EventObject evt) { 
     return true; 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame frame = new JFrame("SpinnerColumn"); 
       JPanel panel = new JPanel(new GridLayout(1, 1)); 
       JTable table = new JTable(5, 1); 
       SpinnerColumn spinnerColumn = new SpinnerColumn(table, 0); 
       table.setDefaultRenderer(Object.class, spinnerColumn); 
       panel.add(table); 
       frame.setContentPane(panel); 
       frame.pack(); 
       frame.setVisible(true); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      } 
     }); 
    } 
} 
+0

我的代碼是基於該代碼或一個非常相似的,我發現jTable1.getCellEditor(行,列).stopCellEditing()對我的作品的極好的板塊+1很好 – user554033 2012-04-21 15:55:51

+0

謝謝 – mKorbel 2012-06-23 19:10:45