Blog de Mario Cezzare Angelicola Chiodi.
Analista de Sistemas, Produtor Musical, Professor, Consultor, entre outras atividades.
+ Quem :
https://www.mcezzare.com.br/ |
https://www.linkedin.com/in/mcezzare/ |
https://github.com/mcezzare | GitHub
+ info musica em :
https://www.insonicmusic.com/ | http://myspace.com/insonic | https://www.facebook.com/insonicmusic | http://soundcloud.com/insonic | http://myspace.com/subsonictrance
Olá, pesquisando na web, achei várias tentativas de colorir uma ou mais linhas de um JTable, mas não tão flexíveis como o que venho apresentar nesse POST.
Uma opção também é usar o Tema Nimbus que já aplica isso nas tabelas.
Eu uso essa classe em meus projetos p/ alternar a cor das linhas de uma tabela, facilitando a visualização do usuário na grade de Dados.
Exemplo :
tabela carregada sem itens selecionados
e ao clicar no checkbox da coluna ATIVO, a linha tem sua cor e fonte alterado, destacando o item selecionado, porém observação: quando seleciona a opção ativo, a linha continua como no exemplo abaixo na linha 5 pois está usando o renderer padrão da tabela.
tabela com os itens selecionados
veja em funcionamento :
http://mario.portari.com.br/~surfer/blog/colorir_jtable.swf
Classe ColorRender que extende a classe DefaultTableCellRenderer
/*
* Colorindo jTable.java
* Pintas as tabelas alterando as linhas
* Destaca uma linha se o checkbox da linha for selecionado
* Author : Mario Cezzare Angelicola Chiodi
* mcezzare@gmail.com
*/
package lib;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
public class ColorRender extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(
JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected,
hasFocus, row, column);
// seta o resultado p/ falso porque isso sera usado em varias Jtables do sistema
boolean result = false;
try{
// no nosso exemplo
if (table.getName() != null) { // p/ não escrever um null cada vez que carregar uma célula
if (table.getName().equals("jTable1")) {
result = (Boolean) table.getModel().getValueAt(row, 3);
}
if (table.getName().equals("titulosAutorizacao")) {
result = (Boolean) table.getModel().getValueAt(row, 6);
}
}
}
catch (java.lang.NullPointerException ex){
System.out.println(ex.getMessage());
}
//se for uma linha selecionada
if (isSelected) {
setBackground(table.getSelectionBackground());
setForeground(table.getSelectionForeground());
} else {
// se o checkbox estiver selecionado
// pinta a linha inteira
if (result) {
setBackground(Color.YELLOW);
setForeground(Color.RED);
setFont(new Font("Verdana",Font.BOLD,10));
} else {
// se não , colore alternado as linhas
if (row % 2 == 0) {
setBackground(Color.LIGHT_GRAY);
setForeground(Color.black);
} else {
setBackground(Color.WHITE);
setForeground(Color.black);
}
}
}
return this;
}
}
Frame testTable
//Colorindo jTable.java
//Author : Mario Cezzare Angelicola Chiodi
// mcezzare@gmail.com
package tests;
import javax.swing.table.DefaultTableModel;
import lib.ColorRender;
public class testTable extends javax.swing.JFrame {
/**
* Creates new form testTable
*/
public testTable() {
initComponents();
carregaTabela();
}
public final DefaultTableModel modelo =new javax.swing.table.DefaultTableModel(
new Object [][] {
},
new String [] {
"ID", "NOME", "EMAIL", "ATIVO"
}
) {
Class[] types = new Class [] {
java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.Boolean.class
};
boolean[] canEdit = new boolean [] {
false, false, false, true
};
public Class getColumnClass(int columnIndex) {
return types [columnIndex];
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit [columnIndex];
}
};
private void carregaTabela() {
// apenas para dar carga na tabela
String [] nomes={"AAA","BBB",
"CCC","DDD",
"EEE","FFF",
"FFF","HHH"
};
for (int i=0;i<8;i++){
Object[] row = new Object[4];
row[0]=i;
row[1]=nomes[i];
row[2]=nomes[i].toLowerCase()+"@email.org";
row[3]=false;
modelo.addRow(row);
}
jTable1.setModel(modelo);
// fim da carga
// a grande manha para funcionar, especifique um nome p/ a JTable
jTable1.setName("jTable1");
// aplica o ColorRender na tabela
jTable1.setDefaultRenderer(Object.class, new ColorRender());
jLbTotal.setText(jTable1.getRowCount()+"");
}
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
jTable1 = new javax.swing.JTable();
jLabel1 = new javax.swing.JLabel();
jLbTotal = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Teste Colorir tabela");
jScrollPane1.setViewportView(jTable1);
jLabel1.setText("Total de Usuários:");
jLbTotal.setText("0");
jLbTotal.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
jLabel2.setFont(new java.awt.Font("Lucida Grande", 0, 10)); // NOI18N
jLabel2.setForeground(new java.awt.Color(0, 0, 255));
jLabel2.setText("exemplo de Mario Cezzare - mcezzare@gmail.com");
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
.addContainerGap())
.add(layout.createSequentialGroup()
.add(jLabel1)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(jLbTotal)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 23, Short.MAX_VALUE)
.add(jLabel2)
.add(14, 14, 14))))
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 222, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(jLabel1)
.add(jLbTotal)
.add(jLabel2))
.addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
pack();
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
// Set the Nimbus look and feel
//* If Nimbus (introduced in Java SE 6) is not available, stay with the
//* default look and feel. For details see
//* http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
//
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(testTable.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(testTable.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(testTable.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(testTable.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
/*
* Create and display the form
*/
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new testTable().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLbTotal;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable jTable1;
// End of variables declaration
}
Olá, como não achei uma calculadora que se atendesse minha necessidade p/ implementar como JInternalFrame, decidi fazer uma.
Este exemplo faz parte de um software de controle financeiro proprietário, que uma das opções contém uma tela p/ controle de movimentação de conta com 4 abas:
Entrada
Transferência
Retirada
Cheque
veja a tela que chama a calculadora :
o ícone calculadora ao lado do campo valor que chama o calculadora.java
Esta Tela é um exemplo de uma aplicação MDI que contém um JDesktop principal e JInternalFrames como as janelas. A calculadora será adicionada ao JDesktop para uso.
Trecho da Classe JIRelatorioConta - que é o Frame de movimentação e chama as calculadoras:
--------------------------------------------------------------------------------
só p/ constar. Essa classe FormUtils, eu uso p/ limpar os campos, listas, tabelas, etc
segue abaixo essa classe :
package lib;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class FormUtils {
public FormUtils() {
}
public void LimpaCampo(JTextField T) {
T.setText(null);
}
public void LimpaCampo(JTextArea T) {
T.setText(null);
T.setText("");
}
public void LimpaCampo(JLabel L) {
L.setText(null);
L.setToolTipText(null);
}
public void LimpaCampo(JList L) {
L.removeAll();
}
public void LimpaCampo(JComboBox C) {
if (C.isEnabled() && C.isValid()) {
C.removeAllItems();
}
}
public void LimpaCombo(JComboBox C) {
C.removeAllItems();
}
public void LimpaCampo(JCheckBox C) {
C.setSelected(false);
}
public void limpaTabela(JTable J) throws Exception {
int totalLinha = J.getRowCount();
int totalColuna = J.getColumnCount();
if (totalLinha > -1) {
for (int i = 0; i < totalLinha; i++) {
for (int j = 0; j < totalColuna; j++) {
J.getModel().setValueAt(null, i, j);
}
}
}
}
public void limpaTabela(JTable J, DefaultTableModel M) throws Exception {
int totalLinha = J.getRowCount();
int totalColuna = J.getColumnCount();
for (int i = 0; i <= M.getRowCount(); i++) {
try {
M.removeRow(i);
} catch (java.lang.ArrayIndexOutOfBoundsException E) {
}
}
if (totalLinha > -1) {
for (int i = 0; i < totalLinha; i++) {
for (int j = 0; j < totalColuna; j++) {
try {
J.getModel().setValueAt(null, i, j);
M.removeRow(i);
} catch (Exception E) {// java.lang.ArrayIndexOutOfBoundsException E) {
}
}
}
}
}
}