2012-04-21 2 views
2

열 중 하나의 셀 편집기를 JSpinner로 설정하고 작동하지만 데이터 모델의 데이터가 변경되면 이전에 활성화 된 편집기는 여전히 활성화되지 않습니다. 이전 행의 값 (존재하지 않거나 변경된 데이터의 다른 위치에 있음).테이블 데이터 모델 변경 후 JTable cellEditor가 유지됩니다.

데이터가 변경 될 때 입력 한 값을 저장하지 않고 선택한 셀의 편집기를 사라지게하려면 어떻게해야합니까?

+0

좋은 코드 일 [SSCCE]와 질문을 편집 할 수 있습니다 (http://sscce.org/) – mKorbel

+0

내가하려고합니다 그런데 jtable.doSomethingWithEditors() 같은 셀 편집기를 숨길 방법이 있습니까? 아니면 내가 뭔가 잘못하고 데이터 변경 후 세포가 편집해서는 안된다? – user554033

답변

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() 날 멋지게 작동합니다. – user554033

+0

좋은 스레드 +1 감사합니다 – mKorbel