Muitos desenvolvedores se deparam com dificuldades sobre o uso de uma JTable
O codigo abaixo trata de uma forma simplificada e de facil entendimento a utilização de uma JTable e seus diferentes “agentes”. Vai desde sua arquitetura a um exemplo mais pratico…
import java.awt.Component;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultCellEditor;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import javax.swing.text.NumberFormatter;
public class TesteTabela extends javax.swing.JFrame {
public TesteTabela() {
initComponents();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jButton1 = new javax.swing.JButton();
jScrollPane1 = new javax.swing.JScrollPane();
jTable1 = new javax.swing.JTable();
jButton2 = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jButton1.setText("Carregar");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
jTable1.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null}
},
new String [] {
"Title 1", "Title 2", "Title 3", "Title 4"
}
));
jScrollPane1.setViewportView(jTable1);
jButton2.setText("Listar");
jButton2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton2ActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jButton1)
.addComponent(jButton2))
.addGap(17, 17, 17))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(24, 24, 24)
.addComponent(jButton1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jButton2))
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
List<Widget> list = new ArrayList<Widget>();
list.add(new Widget("Job", 23.6, "Serra Grande 9", 245));
list.add(new Widget("Job 2", 23.6, "Serra Grande 2", 425));
list.add(new Widget("Job 3", 23.5, "Serra Grande 4", 245));
list.add(new Widget("Job 4", 23.3, "Serra Grande ", 255));
list.add(new Widget("Job 5", 23.1, "Serra Grande", 25));
MyTableModel mtm = new MyTableModel(list);
jTable1.setModel(mtm);
NumberFormat _format = NumberFormat.getCurrencyInstance();
MyCurrencyRenderer _renderer = new MyCurrencyRenderer(_format);
TableColumnModel _model = jTable1.getColumnModel();
TableColumn _column = _model.getColumn(1);
_column.setCellRenderer(_renderer);
NumberFormatter _formatter = new NumberFormatter(_format);
JFormattedTextField _field = new JFormattedTextField(_formatter);
CurrencyCellEditor _editor = new CurrencyCellEditor(_field, _format);
_column.setCellEditor(_editor);
}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
MyTableModel mt = (MyTableModel) jTable1.getModel();
System.out.println("...........................");
for (Widget widget : mt.getAll()) {
System.out.print("Nome : " + widget.getName());
System.out.print("\tLocalização : " + widget.getLocation());
System.out.print("\tQuantidade : " + widget.getQuantity());
System.out.print("\tValue : " + widget.getValue());
System.out.println("...........................");
}
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new TesteTabela().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable jTable1;
// End of variables declaration
class MyTableModel extends AbstractTableModel {
private ArrayList<Widget> datalist = new ArrayList<Widget>();
private String[] columns = {"Name", "Value",
"Location", "Quantity"};
public Widget getWidgetAt(int row) {
return (Widget) datalist.get(row);
}
public Widget removeWidgetAt(int row) {
return (Widget) datalist.remove(row);
}
public void addWidget(Widget w) {
datalist.add(w);
fireTableDataChanged();
}
public void addWidgetList(List l) {
datalist.addAll(l);
fireTableDataChanged();
}
public MyTableModel(List l) {
datalist.addAll(l);
}
public MyTableModel() {
}
public int getRowCount() {
return datalist.size();
}
@Override
public String getColumnName(int i) {
return columns[i];
}
public int getColumnCount() {
return columns.length;
}
public List<Widget> getAll() {
return datalist;
}
@Override
public boolean isCellEditable(int row, int col) {
switch (col) {
case 0: //Name
return false;
case 1: //value
return true;
case 2: //location
return true;
case 3: //quantity
return true;
default:
return false;
}
}
@Override
public Class getColumnClass(int col) {
switch (col) {
case 0: //Name
return String.class;
case 1: //value
return Double.class;
case 2: //location
return String.class;
case 3: //quantity
return Integer.class;
default:
return null;
}
}
@Override
public void setValueAt(Object value, int row, int col) {
Widget w = (Widget) datalist.get(row);
switch (col) {
case 0: //Name
w.setName(value.toString());
break;
case 1: //value
Double _value = (Double) value;
w.setValue(_value.doubleValue());
break;
case 2: //location
w.setLocation(value.toString());
break;
case 3: //quantity
Integer _quantity = (Integer) value;
w.setQuantity(_quantity.intValue());
break;
}
}
public Object getValueAt(int row, int col) {
Widget widget = (Widget) datalist.get(row);
switch (col) {
case 0:
return widget.getName();
case 1:
return new Double(widget.getValue());
case 2:
return widget.getLocation();
case 3:
return new Integer(widget.getQuantity());
default:
return null;
}
}
}
class Widget {
private String name;
private Double value;
private String localition;
private Integer quantity;
public Widget() {
}
public Widget(String name, Double value, String localition, Integer quantity) {
this.name = name;
this.value = value;
this.localition = localition;
this.quantity = quantity;
}
public String getLocation() {
return localition;
}
public void setLocation(String localition) {
this.localition = localition;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getQuantity() {
return quantity;
}
public void setQuantity(Integer quantity) {
this.quantity = quantity;
}
public Double getValue() {
return value;
}
public void setValue(Double value) {
this.value = value;
}
}
class MyCurrencyRenderer extends DefaultTableCellRenderer {
NumberFormat currencyFormat;
public MyCurrencyRenderer(NumberFormat cf) {
currencyFormat = cf;
}
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int col) {
String _formattedValue;
Double _value = (Double) value;
if (value == null) {
_formattedValue = "Not Set";
} else {
_formattedValue = currencyFormat.format(_value);
}
JLabel testLabel = new JLabel(_formattedValue,
SwingConstants.RIGHT);
if (isSelected) {
testLabel.setBackground(table.getSelectionBackground());
testLabel.setOpaque(true);
testLabel.setForeground(table.getSelectionForeground());
}
if (hasFocus) {
testLabel.setForeground(table.getSelectionBackground());
testLabel.setBackground(table.getSelectionForeground());
testLabel.setOpaque(true);
}
return testLabel;
}
}
class CurrencyCellEditor extends DefaultCellEditor {
private NumberFormat currencyFormat;
public CurrencyCellEditor(final JFormattedTextField tf, NumberFormat nf) {
super(tf);
currencyFormat = nf;
tf.setFocusLostBehavior(JFormattedTextField.COMMIT);
tf.setHorizontalAlignment(SwingConstants.RIGHT);
tf.setBorder(null);
delegate = new EditorDelegate() {
@Override
public void setValue(Object param) {
Double _value = (Double) param;
if (_value == null) {
tf.setValue(currencyFormat.format(0.0));
} else {
double _d = _value.doubleValue();
String _format = currencyFormat.format(_d);
// System.out.println("Formatado : "+_format+" d: "+_d);
tf.setValue(_d);
}
}
@Override
public Object getCellEditorValue() {
try {
String _field = tf.getText();
Number _number = currencyFormat.parse(_field);
double _parsed = _number.doubleValue();
Double d = new Double(_parsed);
return d;
} catch (ParseException e) {
e.printStackTrace();
return new Double(0.0);
}
}
};
}
}
}
Espero que ajude Fonte