2013-10-24 3 views
2

Excel 파일의 데이터로 JTable을 채우는 코드가 있습니다. 문제는 JTable에 데이터를 설정 한 후 새 데이터로 테이블을 다시 칠할 수 없다는 것입니다. 정보가 제대로 청구되었지만 테이블을 새로 고치지 마십시오. 그 후에 파일을 선택하면 "Procesar"버튼으로 데이터를 충전합니다. 내 코드는 다음과 같습니다 도와Excel 파일의 데이터로 테이블 JTable 새로 고침

`

import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JFileChooser; 
import javax.swing.JButton; 
import javax.swing.JOptionPane; 
import javax.swing.JScrollPane; 
import javax.swing.JTextField; 

import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.io.File; 
import java.io.FileInputStream; 
import java.util.Vector; 

import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 

import org.apache.poi.hssf.usermodel.HSSFDateUtil; 
import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.xssf.usermodel.XSSFCell; 
import org.apache.poi.xssf.usermodel.XSSFRow; 
import org.apache.poi.xssf.usermodel.XSSFSheet; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 
import java.awt.Color; 
import javax.swing.JTextPane; 
import java.awt.TextArea; 
import javax.swing.border.MatteBorder; 



public class Principal 
{ 
    private File file; 
    Vector header = new Vector(); 
    Vector data = new Vector(); 
    DefaultTableModel model = new DefaultTableModel(data,header); 

    private JFrame frame; 
    private JTextField txtRuta; 
    private JButton btnBuscar; 
    private JButton btnProcesar; 

    private MouseAdapter mouseAdapterBtnBuscar; 
    private MouseAdapter mouseAdapterBtnProcesar; 
    private JTextPane txtPane = new JTextPane(); 
    private TextArea textArea; 
    private JTable table; 


    /** 
    * Método principal que lanza la aplicación 
    */ 
    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() 
      { 
       try 
       { 
        Principal window = new Principal(); 
        window.frame.setVisible(true); 
       } 
       catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Constructor de la clase. 
    */ 
    public Principal() { 
     initialize(); 
    } 

    /** 
    * Inicializa el contenido del Frame visual. 
    */ 
    private void initialize() 
    { 
     inicializeHandlers(); 

     frame = new JFrame(); 
     frame.setBounds(100, 100, 613, 592); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(null); 

     btnBuscar = new JButton("Buscar"); 
     btnBuscar.addMouseListener(mouseAdapterBtnBuscar); 
     btnBuscar.setBounds(498, 11, 89, 23); 
     frame.getContentPane().add(btnBuscar); 

     btnProcesar = new JButton("Procesar"); 
     btnProcesar.addMouseListener(mouseAdapterBtnProcesar); 
     btnProcesar.setBounds(498, 40, 89, 23); 
     frame.getContentPane().add(btnProcesar); 

     txtRuta = new JTextField(); 
     txtRuta.setBounds(10, 12, 478, 20); 
     frame.getContentPane().add(txtRuta); 
     txtRuta.setColumns(10); 

     textArea = new TextArea(); 
     textArea.setBounds(10, 88, 577, 190); 
     frame.getContentPane().add(textArea); 

     table = new JTable(); 
     table.createDefaultColumnsFromModel(); 

     table.setBorder(new MatteBorder(1, 1, 1, 1, (Color) new Color(0, 0, 0))); 
     table.setSurrendersFocusOnKeystroke(true); 
     table.setColumnSelectionAllowed(true); 
     table.setCellSelectionEnabled(true); 
     table.setBounds(10, 321, 577, 190); 
     frame.getContentPane().add(table); 
    } 

    /*Método para controlar los listeners de los componentes.*/ 
    private void inicializeHandlers() 
    {  
     mouseAdapterBtnBuscar = new MouseAdapter() 
     { 
      @Override 
      public void mouseClicked(MouseEvent arg0) 
      { 
       JFileChooser flsBuscador = new JFileChooser(); 
       int result = flsBuscador.showOpenDialog(null); 

       if (result == JFileChooser.APPROVE_OPTION) 
       { 
        file = flsBuscador.getSelectedFile(); 
        txtRuta.setText(file.getAbsolutePath()); 
       } 
      } 
     }; 

     mouseAdapterBtnProcesar = new MouseAdapter() 
     { 
      @Override 
      public void mouseClicked(MouseEvent arg0) 
      { 
       if (txtRuta.getText() == null || txtRuta.getText() == "" || txtRuta.getText().endsWith(".xlsx") == false) 
       { 
        JOptionPane.showMessageDialog(frame, "La ruta no es correcta o el archivo no es soportado.", "Información", JOptionPane.WARNING_MESSAGE); 
       } 
       else 
       { 
        try 
        { 
         procesarArchivo(); 
        } 
        catch(Exception ex) 
        { 
         ex.printStackTrace(); 
        } 
       } 
      } 
     }; 
    } 

    private void procesarArchivo() throws Exception 
    { 
     try 
     { 
      if (file != null) 
      { 
       String text = "Inciando lectura...\n"; 

       FileInputStream fis = new FileInputStream(file); 

       XSSFWorkbook workbook = new XSSFWorkbook(fis); 

       XSSFSheet sheet = workbook.getSheetAt(0); 

       XSSFRow row; 

       textArea.setText(text); 

       for (int i = 6; i < sheet.getPhysicalNumberOfRows(); i ++) 
       { 
        Vector d = new Vector(); 
        row = sheet.getRow(i); 

        for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) 
        { 
         XSSFCell cell = row.getCell(j); 

         if (cell != null) 
         { 
          if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) 
          { 
           if (HSSFDateUtil.isCellDateFormatted(cell)) 
           { 
            d.add(cell.getDateCellValue().toString().trim()); 
            text = text + cell.getDateCellValue().toString().trim() + "\n"; 
            textArea.setText(text); 
           } 
           else 
           { 
            d.add(Double.toString(cell.getNumericCellValue()).trim()); 
            text = text + Double.toString(cell.getNumericCellValue()).trim() + "\n"; 
            textArea.setText(text); 
           } 
          } 
          else 
          { 
           d.add(cell.getStringCellValue().trim()); 
           text = text + cell.getStringCellValue().trim() + "\n"; 
           textArea.setText(text); 
          } 

          if (i == 6) 
          { 
           header.add(d); 
          } 
         } 
         else 
         { 
          d.add("NULL"); 
         } 
        } 

        d.add("\n"); 

        data.add(d); 

       } 

       model = new DefaultTableModel(data, header); 
       table.setModel(model); 

       JScrollPane scroll = new JScrollPane(table); 
       frame.getContentPane().add(scroll); 

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

`

감사합니다;

답변

1

procesarArchivo() 방법 ... 프레임의 콘텐츠 창에 표를 몇 번 추가 하시겠습니까? 현재 코드에서

JScrollPane scroll = new JScrollPane(table); 
frame.getContentPane().add(scroll); 

마다 btnProcesar 새로운 JTable 프레임의 내용 창에 추가됩니다 누르면.

frame.getContentPane().revalidate(); 

양식 Container.add()의 javadoc :

이 방법은 레이아웃 관련 정보를 변경하기 때문에, 구성 요소 계층 구조를 무효화하면 revalidate() 메소드를 호출하지 않기 때문에 당신은 그것을 볼 수 없습니다. 컨테이너가 이미 으로 표시된 경우 추가 된 구성 요소가 표시되도록 을 표시하려면 계층 구조의 유효성을 검사해야합니다. 당신이 revalidate() 메소드를 호출 할 경우

당신은, 그래서 다음 3을 2 표를 볼 수 있습니다 그리고 당신이 원하는 아니다. 새 JTable을 추가하지 마십시오. JTable 하나만 추가하고 대신 TableModel을 새로 고침하십시오.

다른 팁 : frame.getContentPane().setLayout(null); :

+1

사용하여 스윙하면 재 검증'사용해야합니다()'. JTable의'setModel (...)'메소드를 사용하여 테이블의 모델을 변경할 수있다. – camickr

+0

주목! 나는 호기심으로 바뀌었고 좋은 설명으로이 [Q & A] (http://stackoverflow.com/questions/9510125/difference-between-validate-revalidate-and-invalidate-in-swing-gui)를 발견했다. 방금 내 대답을 업데이트했습니다. 감사! @camickr – dic19

+0

도움 주셔서 감사합니다. 그것은 많은 도움이되었습니다. – mrvelez13

관련 문제