2011-03-10 5 views
0

JTable의 셀 편집기를 작성합니다. 이제 버그가 있습니다. 처음 로딩 할 때 기본값을 보여주고 싶습니다. 편집이 끝나면 사용자 입력이 표시됩니다. 응용 프로그램을 실행하면 버그를 이해할 수 있습니다.JTable 셀 편집기 버그

문제를 해결하는 방법은 무엇입니까?

감사합니다.

package com.swing; 

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Arrays; 

import javax.swing.DefaultCellEditor; 
import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.table.DefaultTableModel; 

public class PropPageTest extends JPanel { 

    private static final long serialVersionUID = 1555593265606867986L; 

    public JTableX table; 
    public DefaultTableModel model; 
    private String[] col_names = { "Name", "Value" }; 
    private String[] anchor_values = { "CENTER", "NORTH" }; 
    public String[] default_value = {"John", "NORTH"}; 

    public boolean isFirstTimeLoad = true; 

    private void createGUI() { 
     setLayout(new BorderLayout()); 

     model = new DefaultTableModel(col_names, 2) { 
      private static final long serialVersionUID = 478700329843848400L; 
      public String[] prop_names = { "Name", "Anchor" }; 

      public Object getValueAt(int row, int col) { 
       if (col == 0) return prop_names[row]; 
       if(isFirstTimeLoad){ 
        isFirstTimeLoad = false; 
        return default_value[row]; 
       } 
       else { 
        return super.getValueAt(row, col); 
       }    
      } 

      public boolean isCellEditable(int row, int col) { 
       if (col == 0) return false; 
       return true; 
      } 
     }; 

     table = new JTableX(model); 

     JTextField txtFld = new JTextField(); 
     table.registerCellEditor(0, new DefaultCellEditor(txtFld)); 

     JComboBox cb = new JComboBox(anchor_values);   
     table.registerCellEditor(1, new DefaultCellEditor(cb));   

     add(table, BorderLayout.CENTER); 
    } 

    public static void main(String[] args) { 
     JFrame f = new JFrame("test"); 
     f.setSize(300, 350); 
     final PropPageTest test = new PropPageTest(); 
     f.getContentPane().add(test, BorderLayout.CENTER); 

     JPanel buttonPanel = new JPanel(); 
     JButton saveBtn = new JButton("Save"); 
     buttonPanel.add(saveBtn); 
     f.getContentPane().add(buttonPanel, BorderLayout.SOUTH); 

     saveBtn.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       test.table.stopCellEditing(); 
       String[] newArr = new String[2]; 
       newArr[0] = test.model.getValueAt(0, 1)+""; 
       newArr[1] = test.model.getValueAt(1, 1)+""; 
       boolean isTrue = Arrays.equals(test.default_value, newArr); 

       System.out.println("new value --" + test.model.getValueAt(0, 1)); 
       System.out.println("new value --" + test.model.getValueAt(1, 1)); 
       System.out.println("is true --" + isTrue); 
      } 
     }); 

     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setVisible(true); 
     f.setLocationRelativeTo(null); 
    } 

    public PropPageTest() { 
     createGUI(); 
    } 
} 

- 다른 파일

package com.swing; 


import java.util.HashMap; 
import java.util.Set; 

import javax.swing.JTable; 
import javax.swing.table.TableCellEditor; 
import javax.swing.table.TableModel; 

public class JTableX extends JTable { 
    private static final long serialVersionUID = -7180009397735740833L; 
    private final HashMap<Integer, TableCellEditor> rowEditorMap; 

    public JTableX(TableModel tm) { 
     super(tm); 
     rowEditorMap = new HashMap<Integer, TableCellEditor>(); 
     this.setRowSelectionAllowed(false); 
     this.setColumnSelectionAllowed(false); 
    } 

    public void registerCellEditor(int row, TableCellEditor editor){ 
     rowEditorMap.put(row, editor); 
    } 

    public TableCellEditor getCellEditor(int row, int col) { 
     TableCellEditor tmpEditor = null; 
     if (rowEditorMap != null) tmpEditor = rowEditorMap.get(row); 

     if (tmpEditor != null) return tmpEditor; 
     return super.getCellEditor(row, col); 
    } 

    public void stopCellEditing() { 
     if (rowEditorMap != null) { 
      Set<Integer> keySet = rowEditorMap.keySet(); 
      for (Integer i : keySet) { 
       TableCellEditor tmpEditor = rowEditorMap.get(i); 
       if (tmpEditor != null) {      
        tmpEditor.stopCellEditing(); 
       } 
      } 
     } 
    } 
} 

답변

5

당신은 할 수 없습니다. JTable (또는 코드의 다른 부분)은 원하는 경우 getValueAt를 호출 할 수 있습니다. 메서드는 테이블에 실제로 포함 된 것을 반환해야합니다. 처음에 표의 기본값을 원하면이 기본값을 모델에 저장하십시오.

모델에서 데이터가 변경되면 TableModelEvent가 발생해야합니다. setValueAt가 불려 가면 (자), DefaultTableModel에 의해 자동적으로 행해집니다.