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();
}
}
}
`
감사합니다;
사용하여 스윙하면 재 검증'사용해야합니다()'. JTable의'setModel (...)'메소드를 사용하여 테이블의 모델을 변경할 수있다. – camickr
주목! 나는 호기심으로 바뀌었고 좋은 설명으로이 [Q & A] (http://stackoverflow.com/questions/9510125/difference-between-validate-revalidate-and-invalidate-in-swing-gui)를 발견했다. 방금 내 대답을 업데이트했습니다. 감사! @camickr – dic19
도움 주셔서 감사합니다. 그것은 많은 도움이되었습니다. – mrvelez13