2012-04-21 6 views
2

列の1つにセルエディタを設定して動作させても機能しますが、データモデルのデータが変更されると、古い行からの値(存在しないか、変更されたデータの別の場所にあります)。テーブルデータモデルの変更後にJTable cellEditorが残ります

データが変更されたときに、入力した値を保存して、選択したセルのエディタを表示させないようにするにはどうすればよいですか?

+0

のために良いコードである[SSCCE]であなたの質問を編集することができ(http://sscce.org/) – mKorbel

+0

私がしようとしますそれを行うのですが、jtable.doSomethingWithEditors()のようなセルエディタを隠す方法はありますか?または私は間違った何かをしていて、データ変更後のセルは編集できないはずですか? – user554033

答えて

3

この1つは早いほど良いの助けのためのあなたの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

私のコードは、このコードまたは非常に似て1つに基づいて、私はjTable1.getCellEditor(行、col)を発見した.stopCellEditing()うまく私のために働く – user554033

+0

良いスレッド+1ありがとう – mKorbel

関連する問題