0
In order to implement a monetary value formatting in a jtable, I tried to use the Rafael Chaves as a base and I managed to make the code below.
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.text.NumberFormat;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableCellRenderer;
public class PrincipalTabelaValor extends JFrame {
private final JTable table;
private final int id1 = 1;
private final int id2 = 2;
private final int id3 = 3;
private final double qtd1 = 10.10;
private final double qtd2 = 9.20;
private final double qtd3 = 8.30;
private final double vl1 = 5.50;
private final double vl2 = 6.51;
private final double vl3 = 7.52;
public PrincipalTabelaValor() {
super("Tabela de Cadastro de Produtos");
// constructs the table
String[] columnNames = new String[]{"ID", "Descrição", "quantidade", "Preço"};
Object[][] rowData = new Object[][]{
{id1, "TOMATE", qtd1, vl1},
{id2, "BANANA", qtd2, vl2},
{id3, "UVA", qtd3, vl3}
};
table = new JTable(rowData, columnNames);
table.setDefaultRenderer(Object.class, new CONTabelaProduto());
add(new JScrollPane(table));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(640, 150);
setLocationRelativeTo(null);
}
// CONTROLA A TABELA
public class CONTabelaProduto extends DefaultTableCellRenderer {
private final NumberFormat FORMAT = NumberFormat.getCurrencyInstance();
@Override
public Component getTableCellRendererComponent(JTable jtable, Object conteudo, boolean linhaSelecionada, boolean hasFocus, int linha, int coluna) {
super.getTableCellRendererComponent(jtable, conteudo, linhaSelecionada, hasFocus, linha, coluna);
if (linha % 2 == 0) {
setBackground(new Color(102, 102, 255, 80));
} else {
setBackground(new Color(102, 102, 255, 20));
}
if (linhaSelecionada) {
setBackground(new Color(0, 0, 102, 100));
}
if (conteudo instanceof Double) {
setText(FORMAT.format(conteudo));
}
jtable.setRowHeight(25);
jtable.setFont(new Font("Verdana", 0, 14));
jtable.setOpaque(false);
return this;
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new PrincipalTabelaValor().setVisible(true);
}
});
}
}
As you can see, the formatting was also assigned in the "quantity" column, and I would like to assign this formatting only in the "price" column".
I tried to follow the example of Rob Camick creating the class below.
import java.text.NumberFormat;
import javax.swing.SwingConstants;
public class NumberRenderer extends FormatRenderer {
public NumberRenderer(NumberFormat formatter) {
super(formatter);
setHorizontalAlignment(SwingConstants.RIGHT);
}
public static NumberRenderer getCurrencyRenderer() {
return new NumberRenderer(NumberFormat.getCurrencyInstance());
}
}
And calling the class with
jtable.getColumnModel().getColumn(3).setCellRenderer(NumberRenderer.getCurrencyRenderer());
But ends up overwriting the set background.
I would like to check if there is a way to assign this type of formatting without overwriting the background definition.
Your table only has 4 columns?
– user28595
The original table has many more columns, I created this code just to demonstrate the dilemma I was going through.
– Ernani Jr
@Carlosheuberger agree, this passage would not need to be there, could be defined directly in the main class, along with the table itself.
– user28595
I created that way because my
DefaultTableCellRenderer
stays in a separate class, but thanks for the tip.– Ernani Jr