簡體   English   中英

使用Excel文件中的數據刷新表JTable

[英]Refresh table JTable with data from a Excel file

我有一個代碼,可以用來自Excel文件的數據填充JTable。 問題在於,將數據設置到JTable之后,我無法用新數據重新繪制表。 信息收費正常,但沒有刷新表。 選擇文件后,我通過按鈕“ Procesar”對數據進行收費。 我的代碼是:

`

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();
        }
    }
}

`

謝謝你的幫助;

在您的procesarArchivo()方法中...您想要將表添加到框架的內容窗格中多少次?

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

在您當前的代碼中,每次按下btnProcesar都會將新的JTable添加到框架的內容窗格中。 您只是看不到它,因為您沒有調用revalidate()方法:

frame.getContentPane().revalidate();

形成Container.add() javadoc:

此方法更改與布局有關的信息,因此使組件層次結構無效。 如果已經顯示了容器,則此后必須驗證層次結構才能顯示添加的組件。

如果您調用revalidate()方法,則會看到2個表,然后是3個表,依此類推,這不是您想要的。 不要添加新的JTable 僅添加一個JTable並刷新其TableModel

其他一些技巧:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM