Ola pessoal, estou retornando a estudar java e me deparei com uma situação que não havia prestado atenção antes.
Tem-se a seguinte classe:
import java.awt.Color;
import java.awt.Component;
import java.text.NumberFormat;
import java.util.Locale;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
public class NumberCellRenderer extends DefaultTableCellRenderer {
Locale ptBR = new Locale("pt", "BR");
private static final long serialVersionUID = 1L;
NumberFormat numberFormat = NumberFormat.getCurrencyInstance(ptBR);
@Override
public Component getTableCellRendererComponent(JTable jTable, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component c = super.getTableCellRendererComponent(jTable, value, isSelected, hasFocus, row, column);
if (c instanceof JLabel && value instanceof Number) {
JLabel label = (JLabel) c;
label.setHorizontalAlignment(JLabel.RIGHT);
Number num = (Number) value;
String text = numberFormat.format(num);
label.setText(text);
label.setForeground(num.doubleValue() < 0 ? Color.RED : Color.BLACK);
}
return c;
}
}[/code]
que esta sendo estanciada por esta outra classe:
[code]package com.javarichclient.table;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
/**
*
* @author jbliao
*/
public class NumberCellRendererDemo {
public static void main(String args[]) {
JFrame f = new JFrame("NumberCellRendererDemo");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DefaultTableModel model = new DefaultTableModel();
model.setRowCount(5);
model.setColumnCount(5);
for(int r=0; r < model.getRowCount(); r++ ) {
for( int c=0; c < model.getColumnCount(); c++ ) {
// model.setValueAt(Math.random()*1e6 - 0.5e6, r, c);
model.setValueAt(Math.random()*10*10, r, c);
}
}
JTable table = new JTable(model);
// table.setDefaultRenderer(Object.class, new NumberCellRenderer());
TableColumn teste = table.getColumnModel().getColumn(4);
teste.setCellRenderer(new NumberCellRenderer());
f.getContentPane().add(new JScrollPane(table));
f.pack();
f.setVisible(true);
}
}
O que está comentado é o estado original da classe, eu mudei para ver se funcionava de outra forma e funcionou!
Mas a minha questão é: Qual a regra para que o objeto da classe chame um metodo sem invoca-lo(claro quando ele não eh um metodo construtor)? como na situação acima.
depois eu tentei assim:
NumberCellRenderer render = new NumberCellRenderer();
JTable table = new JTable(model);
// table.setDefaultRenderer(Object.class, new NumberCellRenderer());
TableColumn teste = table.getColumnModel().getColumn(4);
teste.setCellRenderer(render);
Claro, funcionou.
o certo não seria:
NumberCellRenderer render = new NumberCellRenderer();
JTable table = new JTable(model);
// table.setDefaultRenderer(Object.class, new NumberCellRenderer());
TableColumn teste = table.getColumnModel().getColumn(4);
[teste.setCellRenderer(render.getTableCellRendererComponent(com os argumentos));
Isso deve ser o basico, mas estou nessa situação, ainda bem que nao ganho dinheiro com java hehehe
Como isso acontece onde posso ler sobre o assunto?
Obrigado desde ja!