Preciso que ao percorrer as linhas de um JTable, seja com as setas ou clique do mouse, carregar informações complementares sobre o registro em um JTextField. Já pesquisei e não consigo descobrir qual o evento que devo usar, alguém pode ajudar?
Uso JTable com DefaultTableModel
Que informação voce quer carregar quando fizer isso?
Voce pode usar o SelectionListener.
E não use DefaultTableModel. Provavalmente com um model proprio voce nao precisaria fazer outra consulta para obter essa tal informação que voce quer, voce simplesmente pega a informação do objeto respectivo da linha.
Por exemplo, carrego uma lista de clientes. Na lista mostro o nome, porém gostaria de mostrar em um JPanel o endereço.
Usando o Glazed Lists ( http://publicobject.com/glazedlists/ ), criar um TableModel é muito mais fácil.
Vou dar um exemplo mais tarde.
Não só com o GlazedList como com o ObjectTableModel como em um TableModel que voce escreveria.
Repare que os objetos Pessoa nas linhas da JTable já teriam seu endereço mesmo não aparecendo na JTable mas apenas um getEndereco seria o suficiente para mostrar onde voce quer.
package guj;
import java.awt.BorderLayout;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import ca.odell.glazedlists.BasicEventList;
import ca.odell.glazedlists.GlazedLists;
import ca.odell.glazedlists.SortedList;
import ca.odell.glazedlists.swing.EventTableModel;
import ca.odell.glazedlists.swing.TableComparatorChooser;
public class ExemploJTableGlazedLists extends JFrame {
public ExemploJTableGlazedLists() {
super();
// Acrescentando os clientes
customerList = new SortedList<Customer>(new BasicEventList<Customer>());
// Acrescentando alguns clientes, só para ficar mais fácil de entender
Random r = new Random();
for (int i = 1; i <= 20; ++i) {
int id = r.nextInt(10000);
String name = "Cliente " + id;
String address = "Rua dos Bobos, " + r.nextInt(100);
String phone = String.format("(%02d)%04d-%04d", r.nextInt(100), r
.nextInt(10000), r.nextInt(10000));
String ssn = String.format("%03d-%02d-%04d", r.nextInt(1000), r
.nextInt(100), r.nextInt(10000));
customerList.add(new Customer(id, name, address, phone, ssn));
}
initialize();
}
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getSplCustomers(), BorderLayout.CENTER);
}
return jContentPane;
}
private JPanel getPnlDetails() {
if (pnlDetails == null) {
pnlDetails = new JPanel();
pnlDetails.setLayout(new BorderLayout());
pnlDetails.setBorder(BorderFactory.createTitledBorder("Detalhes"));
pnlDetails.add(getScpDetails());
}
return pnlDetails;
}
private JScrollPane getScpClientes() {
if (scpCustomers == null) {
scpCustomers = new JScrollPane();
scpCustomers.setViewportView(getTblCustomers());
}
return scpCustomers;
}
private JScrollPane getScpDetails() {
if (scpDetails == null) {
scpDetails = new JScrollPane();
scpDetails.setViewportView(getTxtDetails());
}
return scpDetails;
}
private JSplitPane getSplCustomers() {
if (splCustomers == null) {
splCustomers = new JSplitPane();
splCustomers.setLeftComponent(getScpClientes());
splCustomers.setRightComponent(getPnlDetails());
splCustomers.setResizeWeight(0.5);
}
return splCustomers;
}
private JTable getTblCustomers() {
if (tblCustomers == null) {
tblCustomers = new JTable();
tblCustomers.setModel(new EventTableModel<Customer>(customerList,
GlazedLists.tableFormat(new String[] { "name", "phone" },
new String[] { "Nome", "Telefone" })));
TableComparatorChooser tableSorter = TableComparatorChooser
.install(tblCustomers, customerList,
TableComparatorChooser.SINGLE_COLUMN);
tblCustomers.getSelectionModel().setSelectionMode(
ListSelectionModel.SINGLE_SELECTION);
tblCustomers.getSelectionModel().addListSelectionListener(
new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
ListSelectionModel lsm = (ListSelectionModel) e
.getSource();
boolean isAdjusting = e.getValueIsAdjusting();
if (!isAdjusting && !lsm.isSelectionEmpty()) {
int minIndex = lsm.getMinSelectionIndex();
if (minIndex >= 0) {
Customer customer = customerList
.get(minIndex);
txtDetails.setText("");
txtDetails.append("Nome: "
+ customer.getName() + "\n");
txtDetails.append("End: "
+ customer.getAddress() + "\n");
txtDetails.append("Tel: "
+ customer.getPhone() + "\n");
txtDetails.append("Ssn: "
+ customer.getSsn() + "\n");
txtDetails.append("Id:" + customer.getId()
+ "\n");
}
}
}
});
}
return tblCustomers;
}
private JTextArea getTxtDetails() {
if (txtDetails == null) {
txtDetails = new JTextArea();
}
return txtDetails;
}
private void initialize() {
this.setSize(400, 300);
this.setContentPane(getJContentPane());
this.setTitle("Exemplo JTable + GlazedLists");
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ExemploJTableGlazedLists thisClass = new ExemploJTableGlazedLists();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setVisible(true);
}
});
}
private JPanel jContentPane = null;
private JPanel pnlDetails = null;
private JScrollPane scpCustomers = null;
private JScrollPane scpDetails = null;
private JSplitPane splCustomers = null;
private JTable tblCustomers = null;
private JTextArea txtDetails = null;
private static final long serialVersionUID = 1L;
private SortedList<Customer> customerList;
}
package guj;
public class Customer implements Comparable<Customer> {
public Customer(int id, String name, String address, String phone,
String ssn) {
this.id = id;
this.name = name;
this.address = address;
this.phone = phone;
this.ssn = ssn;
}
@Override
public int compareTo(Customer that) {
return Integer.valueOf(id).compareTo(Integer.valueOf(that.id));
}
public String getAddress() {
return address;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getPhone() {
return phone;
}
public String getSsn() {
return ssn;
}
public void setAddress(String address) {
this.address = address;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setPhone(String phone) {
this.phone = phone;
}
public void setSsn(String ssn) {
this.ssn = ssn;
}
private String address;
private int id;
private String name;
private String phone;
private String ssn;
}
Exemplo de tela:
No programa que postei, a criação de um TableModel é bem simples. Basta criar um ca.odell.glazedlists.swing.EventTableModel, conforme o seguinte código:
tblCustomers.setModel(new EventTableModel<Customer>(customerList,
GlazedLists.tableFormat(new String[] { "name", "phone" },
new String[] { "Nome", "Telefone" })));
O primeiro String[] são os nomes das propriedades (é claro que a classe Customer deve ter os getters apropriados ) e o segundo String[] são os títulos das colunas da tabela.
Na verdade era isso que eu queria: http://www.guj.com.br/posts/list/43628.java
Mas valeu pelas dicas sobre a restrição ao uso do DefaultTableModel, já que o projeto está no inicio, vou implementar da maneira como sugeriram. Valeu!