/* *Copyright 2007, 2011 CCLS Columbia University (USA), LIFO University of Orl��ans (France), BRGM (France) * *Authors: Cyril Nortet, Xiangrong Kong, Ansaf Salleb-Aouissi, Christel Vrain, Daniel Cassard * *This file is part of QuantMiner. * *QuantMiner is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version. * *QuantMiner is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. * *You should have received a copy of the GNU General Public License along with QuantMiner. If not, see <http://www.gnu.org/licenses/>. */ package src.graphicalInterface; import javax.swing.*; import src.apriori.*; import src.solver.*; import src.tools.*; import java.awt.*; import java.util.*; import java.io.*; import java.awt.font.*; import java.awt.geom.*; import java.awt.image.*; import com.sun.image.codec.jpeg.*; public class RuleBrowser extends javax.swing.JPanel { //step 5 the third panel private static final long serialVersionUID = 1L; private ResolutionContext m_contexteResolution = null; private Font m_fontEnTete = null; private Font m_fontItems = null; private Font m_fontDetails = null; private int m_iIndiceRegleAffichee = 0; private AssociationRule [] m_tReglesFiltrees = null; private Dimension m_dimensionConteneur = null; public RuleBrowser(ResolutionContext contexteResolution) { m_tReglesFiltrees = null; m_iIndiceRegleAffichee = 0; m_contexteResolution = contexteResolution; m_dimensionConteneur = getSize(); //title font m_fontEnTete = UtilDraw.ChargerFonte("font_tahomabd.ttf"); if (m_fontEnTete != null) m_fontEnTete = m_fontEnTete.deriveFont(14.0f); else m_fontEnTete = new Font("Dialog", Font.BOLD|Font.ITALIC, 12); //item font m_fontItems = UtilDraw.ChargerFonte("font_timesbi.ttf"); if (m_fontItems != null) m_fontItems = m_fontItems.deriveFont(11.0f); else m_fontItems = new Font("Dialog", Font.BOLD|Font.ITALIC, 10); //details font m_fontDetails = UtilDraw.ChargerFonte("arial.ttf"); if (m_fontDetails != null) m_fontDetails = m_fontDetails.deriveFont(11.0f); else m_fontDetails = new Font("Dialog", Font.BOLD|Font.ITALIC, 10); } //define a list of rules public void DefinirListeRegles(AssociationRule [] tReglesFiltrees) { m_tReglesFiltrees = tReglesFiltrees; } //define the index of a rule and repaint the rule panel public void DefinirIndiceRegleAffichee(int iIndiceRegleAffichee) { m_iIndiceRegleAffichee = iIndiceRegleAffichee; repaint(); } public int ObtenirIndiceRegleAffichee() { return m_iIndiceRegleAffichee; } public void DefinirDimensionConteneur(int largeur, int hauteur) { m_dimensionConteneur = new Dimension(largeur, hauteur); } public float PeindreRegle(int iNumeroRegle, AssociationRule regle, int iY, int iLargeurZone, Graphics2D g2D) { FontRenderContext frc = null; TextLayout layout = null; LineMetrics mesuresFont = null; Item item = null; ItemQuantitative itemQuant = null; int iLargeurMaxi = 0; int iLargeurMaxiGauche = 0; int iLargeurMaxiDroite = 0; int iIndiceItem = 0; float fHauteurCumulee = 0.0f; float fHauteurCumuleeGauche = 0.0f; float fHauteurCumuleeDroite = 0.0f; float fHauteurCumuleeElement = 0.0f; float fHauteurHautAccolade = 0.0f; float fMilieuItems = 0.0f; String sTexte = null; float fMaxHauteur = 0.0f; Stroke ancienPinceau = null; int iNombreLignesBD = 0; int iPositionMilieuZone = 0; float fValeurConfiance = 0.0f; float fAmplitudeDomaine = 0.0f; float fBorneMin = 0.0f, fBorneMax = 0.0f; float fProportionMin = 0.0f, fProportionMax = 0.0f; boolean bItemsQualitatifsPresents = false; boolean bPremierItemInscrit = false; int iIndiceDisjonction = 0; int iNombreDisjonctions = 0; int iNombreItemsQuantitatifs = 0; int iIndiceCoteRegle = 0; int iPositionTexteX = 0; int iNombreItems = 0; Item tItemsRegle [] = null; int iPositionItemsQuantX = 0; int iLargeurMaxItemsQuantX = 0; if (regle == null) return 0.0f; //set title font g2D.setFont(m_fontEnTete); g2D.setColor( new Color(255, 30, 50) ); frc = g2D.getFontRenderContext(); iPositionMilieuZone = iLargeurZone / 2; iLargeurMaxiGauche = iLargeurMaxiDroite = (iLargeurZone - 140) / 2; sTexte = String.valueOf(iNumeroRegle) + ". "; sTexte += "SUPPORT = "; sTexte += String.valueOf(regle.m_iOccurrences); sTexte += " ("; sTexte += ResolutionContext.EcrirePourcentage(regle.m_fSupport, 2, true); sTexte += ") , CONFIDENCE = "; sTexte += ResolutionContext.EcrirePourcentage(regle.m_fConfiance, 2, true); sTexte += " : "; mesuresFont = m_fontEnTete.getLineMetrics(sTexte, frc); g2D.drawString(sTexte, 20, iY+mesuresFont.getAscent() ); layout = new TextLayout(sTexte, m_fontEnTete, frc); fHauteurCumulee = (float) (layout.getBounds()).getHeight() + 20.0f; g2D.setFont(m_fontItems); frc = g2D.getFontRenderContext(); // left side and right side: for (iIndiceCoteRegle = 0; iIndiceCoteRegle < 2; iIndiceCoteRegle++) { //left side if (iIndiceCoteRegle==0) { iNombreItems = regle.m_iNombreItemsGauche; tItemsRegle = regle.m_tItemsGauche; iNombreItemsQuantitatifs = regle.CompterItemsGaucheSelonType(Item.ITEM_TYPE_QUANTITATIF); iNombreDisjonctions = regle.m_iNombreDisjonctionsGaucheValides; iLargeurMaxi = iLargeurMaxiGauche; iPositionTexteX = 20; } else { iNombreItems = regle.m_iNombreItemsDroite; tItemsRegle = regle.m_tItemsDroite; iNombreItemsQuantitatifs = regle.CompterItemsDroiteSelonType(Item.ITEM_TYPE_QUANTITATIF); iNombreDisjonctions = regle.m_iNombreDisjonctionsDroiteValides; iLargeurMaxi = iLargeurMaxiDroite; iPositionTexteX = iLargeurMaxiGauche + 120; } fHauteurCumuleeElement = fHauteurCumulee; g2D.setColor( new Color(85, 34, 0) ); bPremierItemInscrit = false; for (iIndiceItem = 0; iIndiceItem < iNombreItems; iIndiceItem++) { item = tItemsRegle[iIndiceItem]; if (item.m_iTypeItem == Item.ITEM_TYPE_QUALITATIF) { if (bPremierItemInscrit) fHauteurCumuleeElement += 15.0f; fHauteurCumuleeElement += UtilDraw.PeindreTexteLimite(item.toString(), iLargeurMaxi, iPositionTexteX, iY+(int)fHauteurCumuleeElement, g2D); bPremierItemInscrit = true; } } bItemsQualitatifsPresents = bPremierItemInscrit; // Next display quantitative items: if (iNombreItemsQuantitatifs > 0) { g2D.setColor( new Color(19, 45, 91) ); if (bItemsQualitatifsPresents) fHauteurCumuleeElement += 15.0f; if (iNombreDisjonctions > 1) { iPositionItemsQuantX = iPositionTexteX+20; iLargeurMaxItemsQuantX = iLargeurMaxi-40; } else { iPositionItemsQuantX = iPositionTexteX; iLargeurMaxItemsQuantX = iLargeurMaxi; } for (iIndiceDisjonction = 0; iIndiceDisjonction < iNombreDisjonctions; iIndiceDisjonction++) { if (iIndiceDisjonction>0) fHauteurCumuleeElement += 30.0f + UtilDraw.PeindreTexteCentreLimite("OR", iLargeurMaxi-40, iPositionTexteX+20, iY+(int)fHauteurCumuleeElement+15, g2D); fHauteurHautAccolade = fHauteurCumuleeElement; bPremierItemInscrit = false; for (iIndiceItem = 0; iIndiceItem < iNombreItems; iIndiceItem++) { item = tItemsRegle[iIndiceItem]; if (item.m_iTypeItem == Item.ITEM_TYPE_QUANTITATIF) { if (bPremierItemInscrit) fHauteurCumuleeElement += 15.0f; fHauteurCumuleeElement += UtilDraw.PeindreTexteLimite(((ItemQuantitative)item).toString(iIndiceDisjonction), iLargeurMaxItemsQuantX, iPositionItemsQuantX, iY+(int)fHauteurCumuleeElement, g2D); bPremierItemInscrit = true; } } // Display accolades about des items quantitatifs : if (iNombreDisjonctions > 1) { ancienPinceau = g2D.getStroke(); g2D.setStroke( new BasicStroke(2.0f) ); fMilieuItems = fHauteurHautAccolade + (fHauteurCumuleeElement - fHauteurHautAccolade)/2; UtilDraw.PeindreAccolade(iPositionTexteX+10, (float)iY + fMilieuItems, (fHauteurCumuleeElement-fHauteurHautAccolade)/2 + 2.0f, true, g2D); UtilDraw.PeindreAccolade(iPositionTexteX+10+iLargeurMaxi-20, (float)iY + fMilieuItems, (fHauteurCumuleeElement-fHauteurHautAccolade)/2 + 2.0f, false, g2D); g2D.setStroke(ancienPinceau); } } } if (iIndiceCoteRegle == 0) fHauteurCumuleeGauche = fHauteurCumuleeElement; else fHauteurCumuleeDroite = fHauteurCumuleeElement; } fMaxHauteur = java.lang.Math.max(fHauteurCumuleeGauche, fHauteurCumuleeDroite) - fHauteurCumulee; fMilieuItems = fHauteurCumulee + fMaxHauteur/2; g2D.setColor( Color.BLACK ); g2D.setPaint( Color.BLACK ); // Display de la fl�che : UtilDraw.PeindreFleche(iLargeurMaxiGauche+35, iY + (int)fMilieuItems, g2D); // Display des accolades : ancienPinceau = g2D.getStroke(); g2D.setStroke( new BasicStroke(2.0f) ); UtilDraw.PeindreAccolade(10.0f, (float)iY + fMilieuItems, fMaxHauteur/2 + 2.0f, true, g2D); UtilDraw.PeindreAccolade(iLargeurMaxiGauche+30.0f, (float)iY + fMilieuItems, fMaxHauteur/2 + 2.0f, false, g2D); UtilDraw.PeindreAccolade(iLargeurMaxiGauche+110.0f, (float)iY + fMilieuItems, fMaxHauteur/2 + 2.0f, true, g2D); UtilDraw.PeindreAccolade(iLargeurMaxiGauche+iLargeurMaxiDroite+130.0f, (float)iY + fMilieuItems, fMaxHauteur/2 + 2.0f, false, g2D); g2D.setStroke(ancienPinceau); // Display the indicator of the 2 parties of the rule: g2D.setFont(m_fontEnTete); g2D.drawString("A", 3, iY+(int)fHauteurCumulee+2); g2D.drawString("B", iLargeurMaxiGauche+103, iY+(int)fHauteurCumulee+2); fHauteurCumulee += fMaxHauteur; //set detail font g2D.setFont(m_fontDetails); g2D.setColor( Color.BLACK ); fHauteurCumulee += 15.0f; //display the percentage bar //left and right side for (iIndiceCoteRegle = 0; iIndiceCoteRegle < 2; iIndiceCoteRegle++) { //left side if (iIndiceCoteRegle==0) { iNombreItems = regle.m_iNombreItemsGauche; tItemsRegle = regle.m_tItemsGauche; iNombreItemsQuantitatifs = regle.CompterItemsGaucheSelonType(Item.ITEM_TYPE_QUANTITATIF); iNombreDisjonctions = regle.m_iNombreDisjonctionsGaucheValides; } else { iNombreItems = regle.m_iNombreItemsDroite; tItemsRegle = regle.m_tItemsDroite; iNombreItemsQuantitatifs = regle.CompterItemsDroiteSelonType(Item.ITEM_TYPE_QUANTITATIF); iNombreDisjonctions = regle.m_iNombreDisjonctionsDroiteValides; } if (iNombreItemsQuantitatifs > 0) { fHauteurCumulee += 15.0f; if (iIndiceCoteRegle==0) fHauteurCumulee += 15.0f; // + UtilDessin.PeindreTexteLimite("PROPORTIONS DU DOMAINE COUVERT PAR LES INTERVALLES DE LA PARTIE LEFT :", iLargeurZone-20, 10, iY+(int)fHauteurCumulee, g2D); else fHauteurCumulee += 15.0f; // + UtilDessin.PeindreTexteLimite("PROPORTIONS DU DOMAINE COUVERT PAR LES INTERVALLES DE LA PARTIE RIGHT :", iLargeurZone-20, 10, iY+(int)fHauteurCumulee, g2D); } if (iNombreItemsQuantitatifs > 0) for (iIndiceDisjonction = 0; iIndiceDisjonction < iNombreDisjonctions; iIndiceDisjonction++) { if (iIndiceDisjonction > 0) fHauteurCumulee += 10.0f; fHauteurHautAccolade = fHauteurCumulee; for (iIndiceItem = 0; iIndiceItem < iNombreItems; iIndiceItem++) { item = tItemsRegle[iIndiceItem]; if (item.m_iTypeItem == Item.ITEM_TYPE_QUANTITATIF) { itemQuant = (ItemQuantitative)item; UtilDraw.PeindreTexteLimite(itemQuant.m_attributQuant.ObtenirNom()+" :", 90, 30, iY+(int)fHauteurCumulee, g2D); g2D.drawRect(130, iY+(int)fHauteurCumulee, 300, 10); fBorneMin = itemQuant.m_attributQuant.m_colonneDonnees.ObtenirBorneMin(); fBorneMax = itemQuant.m_attributQuant.m_colonneDonnees.ObtenirBorneMax(); fAmplitudeDomaine = fBorneMax - fBorneMin; if (fAmplitudeDomaine != 0.0f) { fProportionMin = (itemQuant.ObtenirBorneMinIntervalle(iIndiceDisjonction) - fBorneMin) / fAmplitudeDomaine; fProportionMax = (itemQuant.ObtenirBorneMaxIntervalle(iIndiceDisjonction) - fBorneMin) / fAmplitudeDomaine; } else fProportionMin = fProportionMax = 0.0f; int iTailleProportionAffichee = 0; iTailleProportionAffichee = (int)((fProportionMax-fProportionMin)*300.0f); if (iTailleProportionAffichee < 1) iTailleProportionAffichee = 1; g2D.fillRect(130+(int)(fProportionMin*300.0f), iY+(int)fHauteurCumulee, iTailleProportionAffichee, 10); sTexte = ResolutionContext.EcrirePourcentage((fProportionMax-fProportionMin), 2, true) + " of ["; sTexte += String.valueOf(fBorneMin) + ", " + String.valueOf(fBorneMax) + "]"; UtilDraw.PeindreTexteLimite(sTexte, iLargeurZone-460, 450, iY+(int)fHauteurCumulee, g2D); fHauteurCumulee += 20.0f; } } ancienPinceau = g2D.getStroke(); g2D.setStroke( new BasicStroke(2.0f) ); UtilDraw.PeindreAccolade(20, (float)iY+fHauteurHautAccolade+(fHauteurCumulee-10.0f-fHauteurHautAccolade)/2, (fHauteurCumulee-10.0f-fHauteurHautAccolade)/2 + 2.0f, true, g2D); g2D.setStroke(ancienPinceau); } } // Display the mesures suppl�mentaires : iNombreLignesBD = m_contexteResolution.m_gestionnaireBD.ObtenirNombreLignes(); fHauteurCumulee += 20.0f; fHauteurCumuleeGauche = fHauteurCumulee; fHauteurCumuleeDroite = fHauteurCumulee; g2D.setFont(m_fontDetails); //Display the supports : g2D.setColor( Color.BLUE ); UtilDraw.PeindreTexteLimite("SUPPORTS :", 100, 10, iY+(int)fHauteurCumuleeGauche, g2D); fHauteurCumuleeGauche += 20.0f; UtilDraw.PeindreTexteLimite("A and B", 80, 10, iY+(int)fHauteurCumuleeGauche, g2D); g2D.fill3DRect(100, iY+(int)fHauteurCumuleeGauche, (120*regle.m_iOccurrences) / iNombreLignesBD, 10, true); UtilDraw.PeindreTexteLimite(m_contexteResolution.EcrireSupport(regle.m_iOccurrences), 90, 230, iY+(int)fHauteurCumuleeGauche, g2D); fHauteurCumuleeGauche += 15.0f; UtilDraw.PeindreTexteLimite("A", 80, 10, iY+(int)fHauteurCumuleeGauche, g2D); g2D.fill3DRect(100, iY+(int)fHauteurCumuleeGauche, (120*regle.m_iOccurrencesGauche) / iNombreLignesBD, 10, true); UtilDraw.PeindreTexteLimite(m_contexteResolution.EcrireSupport(regle.m_iOccurrencesGauche), 90, 230, iY+(int)fHauteurCumuleeGauche, g2D); fHauteurCumuleeGauche += 15.0f; UtilDraw.PeindreTexteLimite("B", 80, 10, iY+(int)fHauteurCumuleeGauche, g2D); g2D.fill3DRect(100, iY+(int)fHauteurCumuleeGauche, (120*regle.m_iOccurrencesDroite) / iNombreLignesBD, 10, true); UtilDraw.PeindreTexteLimite(m_contexteResolution.EcrireSupport(regle.m_iOccurrencesDroite), 90, 230, iY+(int)fHauteurCumuleeGauche, g2D); fHauteurCumuleeGauche += 15.0f; UtilDraw.PeindreTexteLimite("A and (~B)", 80, 10, iY+(int)fHauteurCumuleeGauche, g2D); g2D.fill3DRect(100, iY+(int)fHauteurCumuleeGauche, (120*regle.m_iOccurrences_Gauche_NonDroite) / iNombreLignesBD, 10, true); UtilDraw.PeindreTexteLimite(m_contexteResolution.EcrireSupport(regle.m_iOccurrences_Gauche_NonDroite), 90, 230, iY+(int)fHauteurCumuleeGauche, g2D); fHauteurCumuleeGauche += 15.0f; UtilDraw.PeindreTexteLimite("(~A) and B", 80, 10, iY+(int)fHauteurCumuleeGauche, g2D); g2D.fill3DRect(100, iY+(int)fHauteurCumuleeGauche, (120*regle.m_iOccurrences_NonGauche_Droite) / iNombreLignesBD, 10, true); UtilDraw.PeindreTexteLimite(m_contexteResolution.EcrireSupport(regle.m_iOccurrences_NonGauche_Droite), 90, 230, iY+(int)fHauteurCumuleeGauche, g2D); fHauteurCumuleeGauche += 15.0f; UtilDraw.PeindreTexteLimite("(~A) and (~B)", 80, 10, iY+(int)fHauteurCumuleeGauche, g2D); g2D.fill3DRect(100, iY+(int)fHauteurCumuleeGauche, (120*regle.m_iOccurrences_NonGauche_NonDroite) / iNombreLignesBD, 10, true); UtilDraw.PeindreTexteLimite(m_contexteResolution.EcrireSupport(regle.m_iOccurrences_NonGauche_NonDroite), 90, 230, iY+(int)fHauteurCumuleeGauche, g2D); fHauteurCumuleeGauche += 15.0f; // Display the confidences : g2D.setColor( Color.RED ); UtilDraw.PeindreTexteLimite("CONFIDENCES:", 100, iPositionMilieuZone+10, iY+(int)fHauteurCumuleeDroite, g2D); fHauteurCumuleeDroite += 20.0f; fValeurConfiance = ((float)regle.m_iOccurrences) / ((float)regle.m_iOccurrencesGauche); UtilDraw.PeindreTexteLimite("A -> B", 80, iPositionMilieuZone+10, iY+(int)fHauteurCumuleeDroite, g2D); g2D.fill3DRect(iPositionMilieuZone+100, iY+(int)fHauteurCumuleeDroite, (int)(120.0f*fValeurConfiance), 10, true); UtilDraw.PeindreTexteLimite(ResolutionContext.EcrirePourcentage(fValeurConfiance, 2, true), 90, iPositionMilieuZone+230, iY+(int)fHauteurCumuleeDroite, g2D); fHauteurCumuleeDroite += 15.0f; UtilDraw.PeindreTexteLimite("(~A) -> B", 80, iPositionMilieuZone+10, iY+(int)fHauteurCumuleeDroite, g2D); if ( (iNombreLignesBD - regle.m_iOccurrencesGauche) == 0) UtilDraw.PeindreTexteLimite("ind�termin� car 'non A' n'apparait jamais dans la BD.", 220, iPositionMilieuZone+100, iY+(int)fHauteurCumuleeDroite, g2D); else { fValeurConfiance = ((float)regle.m_iOccurrences_NonGauche_Droite) / ((float)(iNombreLignesBD - regle.m_iOccurrencesGauche)); g2D.fill3DRect(iPositionMilieuZone+100, iY+(int)fHauteurCumuleeDroite, (int)(120.0f*fValeurConfiance), 10, true); UtilDraw.PeindreTexteLimite(ResolutionContext.EcrirePourcentage(fValeurConfiance, 2, true), 90, iPositionMilieuZone+230, iY+(int)fHauteurCumuleeDroite, g2D); } fHauteurCumuleeDroite += 15.0f; fValeurConfiance = ((float)regle.m_iOccurrences) / ((float)regle.m_iOccurrencesDroite); UtilDraw.PeindreTexteLimite("B -> A", 80, iPositionMilieuZone+10, iY+(int)fHauteurCumuleeDroite, g2D); g2D.fill3DRect(iPositionMilieuZone+100, iY+(int)fHauteurCumuleeDroite, (int)(120.0f*fValeurConfiance), 10, true); UtilDraw.PeindreTexteLimite(ResolutionContext.EcrirePourcentage(fValeurConfiance, 2, true), 90, iPositionMilieuZone+230, iY+(int)fHauteurCumuleeDroite, g2D); fHauteurCumuleeDroite += 15.0f; UtilDraw.PeindreTexteLimite("(~B) -> A", 80, iPositionMilieuZone+10, iY+(int)fHauteurCumuleeDroite, g2D); if ( (iNombreLignesBD - regle.m_iOccurrencesDroite) == 0) UtilDraw.PeindreTexteLimite("ind�termin� car 'non B' n'apparait jamais dans la BD.", 220, iPositionMilieuZone+100, iY+(int)fHauteurCumuleeDroite, g2D); else { fValeurConfiance = ((float)regle.m_iOccurrences_Gauche_NonDroite) / ((float)(iNombreLignesBD - regle.m_iOccurrencesDroite)); g2D.fill3DRect(iPositionMilieuZone+100, iY+(int)fHauteurCumuleeDroite, (int)(120.0f*fValeurConfiance), 10, true); UtilDraw.PeindreTexteLimite(ResolutionContext.EcrirePourcentage(fValeurConfiance, 2, true), 90, iPositionMilieuZone+230, iY+(int)fHauteurCumuleeDroite, g2D); } fHauteurCumuleeDroite += 30.0f; fValeurConfiance = ((float)(regle.m_iOccurrences + regle.m_iOccurrences_NonGauche_NonDroite)) / ((float)iNombreLignesBD); UtilDraw.PeindreTexteLimite("A <-> B", 80, iPositionMilieuZone+10, iY+(int)fHauteurCumuleeDroite, g2D); g2D.fill3DRect(iPositionMilieuZone+100, iY+(int)fHauteurCumuleeDroite, (int)(120.0f*fValeurConfiance), 10, true); UtilDraw.PeindreTexteLimite(ResolutionContext.EcrirePourcentage(fValeurConfiance, 2, true), 90, iPositionMilieuZone+230, iY+(int)fHauteurCumuleeDroite, g2D); fHauteurCumuleeDroite += 15.0f; // Trac� du s�parateur entre infos de support et infos de confiance : fMaxHauteur = java.lang.Math.max(fHauteurCumuleeGauche, fHauteurCumuleeDroite); g2D.setColor( Color.BLACK ); g2D.drawLine(iPositionMilieuZone, iY+((int)fHauteurCumulee)+5, iPositionMilieuZone, iY+((int)fMaxHauteur)-10); fHauteurCumulee = fMaxHauteur; return fHauteurCumulee; } public static Graphics2D antialias(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); g2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); // Enable antialiasing for shapes g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); return g2; } protected void paintComponent(Graphics g) { Graphics2D g2D = null; AssociationRule regle = null; float fHauteurCumulee = 0.0f; g2D = antialias(g); super.paintComponent(g); if ( (m_tReglesFiltrees == null) || (m_iIndiceRegleAffichee<0) ) { fHauteurCumulee = (float)(m_dimensionConteneur.height/2-12); g2D.setFont(m_fontEnTete); g2D.setColor( new Color(255, 30, 50) ); fHauteurCumulee += UtilDraw.PeindreTexteCentreLimite("No rule returned for the selected critera.", getWidth(), 0, (int)fHauteurCumulee, g2D); setPreferredSize( new Dimension(getWidth(), (int)fHauteurCumulee) ); revalidate(); return; } try { fHauteurCumulee = 10.0f; regle = m_tReglesFiltrees[m_iIndiceRegleAffichee]; fHauteurCumulee += 10.0f + PeindreRegle(1+m_iIndiceRegleAffichee, regle, (int)fHauteurCumulee, getWidth(), g2D); setPreferredSize( new Dimension(getWidth(), (int)fHauteurCumulee) ); revalidate(); } catch (IndexOutOfBoundsException e) {} } // Enregistre dans un fichier JPEG la repr�sentation graphique de la r�gle : public void EnregistrerImageRegle(AssociationRule regle, int iIndiceRegle, String sCheminFichier) { BufferedImage imageRegle = null; Graphics2D contexteImage = null; File fichierImage = null; FileOutputStream fluxSortieImage = null; JPEGImageEncoder encoderJPEG = null; boolean bProcessusInterrompu = false; int iLargeur = 0, iHauteur = 0; if ( (sCheminFichier == null) || (regle == null) ) return; iLargeur = 950; iHauteur = 1; imageRegle = new BufferedImage(iLargeur, iHauteur, BufferedImage.TYPE_INT_RGB); contexteImage = antialias(imageRegle.createGraphics()); if (contexteImage != null) { if (m_tReglesFiltrees != null) { bProcessusInterrompu = false; // On peint l'image une premi�re fois pour calculer sa hauteur : contexteImage.setColor(Color.WHITE); contexteImage.fillRect(0, 0, iLargeur, iHauteur); iHauteur = 10 + (int)PeindreRegle(1+iIndiceRegle, regle, 10, iLargeur, contexteImage); contexteImage = null; imageRegle = null; // Puis on la peint une seconde fois dans une image � la bonne dimension : imageRegle = new BufferedImage(iLargeur, iHauteur, BufferedImage.TYPE_INT_RGB); contexteImage = imageRegle.createGraphics(); if (contexteImage != null) { contexteImage.setColor(Color.WHITE); contexteImage.fillRect(0, 0, iLargeur, iHauteur); PeindreRegle(1+iIndiceRegle, regle, 10, iLargeur, contexteImage); try { fichierImage = new File(sCheminFichier); fluxSortieImage = new FileOutputStream(fichierImage); } catch (FileNotFoundException e1) { bProcessusInterrompu = true; } catch (SecurityException e2) { bProcessusInterrompu = true; } try { encoderJPEG = JPEGCodec.createJPEGEncoder(fluxSortieImage); encoderJPEG.encode(imageRegle); } catch (IOException e1) {} catch (ImageFormatException e2) {} try { fluxSortieImage.close(); } catch (IOException e) {} } } } } }