cscalea
Dezembro 2, 2018, 3:53pm
#1
vou tentar ser bem claro e rápido…
tenho JTextField’s “Nome” e “Fone”… a pessoa escreve no JFrame os dados, e aperta em salvar…
no mesmo JFrame tem um JTable. quando a pessoa aperta em SALVAR, os dados dos JTextFields vão pro JTable…
table = new JTable();
table.setModel(new DefaultTableModel(
new Object[][]
{
{null, null, null},
{null, null, null},
{null, null, null},
{null, null, null},
},
new String[] {"ID", "NOME", "VALOR"}
));
table.setBounds(40, 380, 600, 200);
private class SalvarAction implements ActionListener{
@Override
public void actionPerformed(ActionEvent event){
if(salvar == event.getSource())
DefaultTableModel model = (DefaultTableModel) jTablel.getModel();
model.addRow(txtNome.getText(), txtFone.getText());
JTable.validate();
}
}
(sei que o código está horrível, galera, tô começando agora com essas paradas de interface gráfica, e tô meio perdido também com esse DefaultTableModel… agradeço qualquer ajuda valeuuu)
Não utilize DefaultTableModel
, crie seu próprio TableModel
para renderizar uma coleção de objetos.
Suponha que você tenha objetos do tipo Contato
, definidos pela classe abaixo:
public class Contato {
private String nome;
private String telefone;
public String getNome() {
return nome;
}
public String getTelefone() {
return telefone;
}
public void setNome(String nome) {
this.nome = nome;
}
public void setTelefone(String telefone) {
this.telefone = telefone;
}
}
Veja como ficaria um exemplo bem simples de uma telinha de cadastro usando JTable
:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.UIManager;
import javax.swing.event.ListSelectionEvent;
import javax.swing.table.AbstractTableModel;
public class Exemplo extends JFrame {
private class ContatoTableModel extends AbstractTableModel {
private final String[] colunas = new String[] { "Nome", "Telefone" };
@Override
public int getColumnCount() {
return colunas.length;
}
@Override
public String getColumnName(int col) {
return colunas[col];
}
@Override
public int getRowCount() {
return contatos.size();
}
@Override
public Object getValueAt(int lin, int col) {
if (lin > -1 && lin < contatos.size()) {
Contato contato = contatos.get(lin);
switch (col) {
case 0:
return contato.getNome();
case 1:
return contato.getTelefone();
}
}
return null;
}
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
Exemplo tela = new Exemplo();
tela.setDefaultCloseOperation(EXIT_ON_CLOSE);
tela.setLocationRelativeTo(null);
tela.setVisible(true);
} catch (Throwable t) {
t.printStackTrace();
}
}
private JTextField textFieldNome;
private JTextField textFieldTelefone;
private ContatoTableModel contatoTableModel;
private List<Contato> contatos = new ArrayList<>();
private Contato contatoAtual = new Contato();
Exemplo() {
super("Telinha de Exemplo");
setMinimumSize(new Dimension(800, 600));
Container container = getContentPane();
container.add(criarPainelCampos(), BorderLayout.NORTH);
container.add(criarPainelTabela(), BorderLayout.CENTER);
}
private void atualizarCampos() {
String nome = contatoAtual.getNome();
String telefone = contatoAtual.getTelefone();
textFieldNome.setText(nome);
textFieldTelefone.setText(telefone);
}
private Component criarPainelCampos() {
textFieldNome = new JTextField();
textFieldNome.setPreferredSize(new Dimension(200, 36));
textFieldTelefone = new JTextField();
textFieldTelefone.setPreferredSize(new Dimension(200, 36));
JButton buttonNovo = new JButton("Novo");
buttonNovo.setPreferredSize(new Dimension(100, 36));
buttonNovo.addActionListener(event -> novo());
JButton buttonSalvar = new JButton("Salvar");
buttonSalvar.setPreferredSize(new Dimension(100, 36));
buttonSalvar.addActionListener(event -> salvar());
JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER));
panel.add(buttonNovo);
panel.add(new JLabel("Nome:"));
panel.add(textFieldNome);
panel.add(new JLabel("Telefone:"));
panel.add(textFieldTelefone);
panel.add(buttonSalvar);
return panel;
}
private Component criarPainelTabela() {
contatoTableModel = new ContatoTableModel();
JTable table = new JTable(contatoTableModel);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.getSelectionModel().addListSelectionListener(event -> selecionou(event));
return new JScrollPane(table);
}
private void novo() {
contatoAtual = new Contato();
contatos.add(contatoAtual);
atualizarCampos();
}
private void salvar() {
String nome = textFieldNome.getText();
String telefone = textFieldTelefone.getText();
contatoAtual.setNome(nome);
contatoAtual.setTelefone(telefone);
contatoTableModel.fireTableDataChanged();
}
private void selecionou(ListSelectionEvent event) {
if (event.getValueIsAdjusting()) {
return;
}
int linha = event.getFirstIndex();
contatoAtual = contatos.get(linha);
atualizarCampos();
}
}