2014-10-16 2 views
0

나는 텍스트 파일의 데이터를 읽고 사용자가 it.i에서 편집 한 후에 다른 텍스트 파일에 저장하는 UI를 만들고 있는데, 6 열을 제외한 모든 열에 정수 값을 반환하고 7.For 열 6 및 7 double 값을 반환하려면.이 프로그램의 모든 항목을 잘 6 열 및 7 열 때 사용자가 정수 값을 입력 할 때까지 편집 할 때 그것은 셀에 빨간색 표시를 보여줍니다 반면 나는 이중해야합니다.은 JTable에서 Double 값을 반환 할 수 없습니다.

import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class Read extends JFrame 
{ 
private JTable table; 
private DefaultTableModel model; 

@SuppressWarnings("unchecked") 
public Read() 
{ 

     String aLine ; 
     Vector columnNames = new Vector(); 
     Vector data = new Vector(); 

     try 
     { 
      FileInputStream fin = new FileInputStream("test1.txt"); 
      BufferedReader br = new BufferedReader(new InputStreamReader(fin)); 


      StringTokenizer st1 = new StringTokenizer(br.readLine(), " "); 

      while(st1.hasMoreTokens()) 
      { 
       columnNames.addElement(st1.nextToken()); 
      } 


      while ((aLine = br.readLine()) != null) 
      { 
       StringTokenizer st2 = new StringTokenizer(aLine, " "); 
       Vector row = new Vector(); 

       while(st2.hasMoreTokens()) 
       { 
        row.addElement(st2.nextToken()); 
       } 
       data.addElement(row); 
      } 
      br.close(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

     final JTable table = new JTable(new DefaultTableModel(data, columnNames){ 
     private static final long serialVersionUID = 1L; 

    @Override 
    public Class getColumnClass(int column) { 
     return Integer.class; 
     } 
    }); 


    JScrollPane scrollPane = new JScrollPane(table); 
     getContentPane().add(scrollPane); 


     JPanel buttonPanel = new JPanel(); 
     getContentPane().add(buttonPanel, BorderLayout.SOUTH); 


     JButton button1 = new JButton("Save"); 
     buttonPanel.add(button1); 
     button1.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       if (table.isEditing()) 
       { 
        int row = table.getEditingRow(); 
        int col = table.getEditingColumn(); 
        table.getCellEditor(row, col).stopCellEditing(); 
       } 

       int rows = table.getRowCount(); 
       int columns = table.getColumnCount(); 



    try { 
     StringBuilder con = new StringBuilder(); 
     for (int i = 0; i < rows; i++) 
     { 
      for (int j = 0; j < columns; j++) 
      { 
       Object Value = table.getValueAt (i, j); 
       con.append(" "); 
       con.append(Value); 
      } 
      con.append("\r\n"); 
     } 

    FileWriter fileWriter = new FileWriter(new File("new.txt")); 

    fileWriter.write(con.toString()); 
    fileWriter.flush(); 

    } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 
    }); 

    } 

public static void main(String[] args) 
{ 
     Read a = new Read(); 
     a.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     a.pack(); 
     a.setVisible(true); 
} 
} 

텍스트 파일

: 열 여섯과 열 7.please 도움

코드 값

1 2 3 4 5 6 7 8 
78 12 12 45 4 0.0045 0.0078 45 
45 45 69 56 7 0.0056 0.0023 21 
45 89 76 42 1 0.0036 0.0023 36 
+1

'getColumnClass'가'Integer.class; '만 반환하면 어떻게 두 배를 지원한다고 생각합니까? – MadProgrammer

+0

['StringTokenizer' API] (http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html)에 설명 된대로 단지 FYI입니다. - "'StringTokenizer'는 레거시 클래스는 호환성을 위해 유지되지만 새로운 코드에서는 사용하지 않는 것이 좋습니다.이 기능을 사용하려는 사람은 누구나'string'의'split' 메소드를 사용하는 것이 좋습니다. –

+0

또한 값을 파싱 한 후 벡터 –

답변

4

TableModel#getColumnClassJTable에서 사용할 렌더러와 편집기를 결정하는 데 사용됩니다.

Integer.class을 열 클래스로 사용하면 JTableJFormattedField이 전체 숫자 만 허용되도록 구성합니다. 당신은, 예를 들어 ... 주어진 컬럼의 올바른 데이터 형식을 반환하는 getColumnClass을 수정해야

@Override 
public Class getColumnClass(int column) { 
    return column == 5 || column == 6 ? Double.class : Integer.class; 
} 

당신은 또한 당신이 모델에 입력하는 데이터가 모임이 계약 할 수 있는지 확인해야합니다, 예를 들어 ...

while (st2.hasMoreTokens()) { 
    Object num = null; 
    String value = st2.nextToken(); 
    Number num = NumberFormat.getNumberInstance().parse(value); 
    row.addElement(num); 
} 
+0

고마워요 @ MadProgrammer, 내가 열심히 내 텍스트 파일에서 5.33e-02.so 내가 시도한 열 8 변경 말해주십시오 수 : 반환 열 == 5 || 열 == 6? Double.class : column == 7? String.class : Integer.class; 위의 코드를 동일하게 유지합니다. 열 8에서 편집하고 문자열 값을 입력 할 수 있지만 파일에서 값 5.33e-02를 읽으면 나머지 e-02를 무시한 테이블에 5.33 만 표시합니다. 안내하십시오 – user

+0

반환 할 두 가지 클래스 유형이 더 많으면 switch 문이나 if 문을 사용하여 관리하기 쉽습니다. 값을 파일에서 읽으면 자동으로 두 배로 해석됩니다. – MadProgrammer

+0

5 번 열에 5.33e-02를 어떻게 반환 할 수 있습니까? – user