RESOLVIDO - Erro ou usar o método parseDouble

7 respostas
P

Pessoal estou estudando e tentando usar essa classe que peguei na internet do professor Osmar J. Silva.
O original é assim:

class Colorir extends JLabel implements TableCellRenderer{
  public Component getTableCellRendererComponent(
     JTable table, Object value, boolean isSelected,
        boolean hasFocus, int row, int column){
    
     if(Integer.parseInt(value.toString()) < 20){
       setForeground(Color.BLUE);	
     }
     else{
       setForeground(Color.BLACK);		
     }
     
     setText(value.toString());
     	
     return this;   	
  }
  
  public void validate() {}
  public void revalidate() {}
  protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {}
  public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}  
}

porém eu gostaria de usá-la assim:

class Colorir extends JLabel implements TableCellRenderer{
    public Component getTableCellRendererComponent(
            JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){                
                double a =Double.parseDouble((value.toString().replaceAll(",", ".")));
                if(a < 5.0){                    
                    setForeground(Color.RED);
                }
                else{
                    setForeground(Color.GREEN);
                }
                setText(value.toString());
                return this;
    }
    public void validate() {}
    public void revalidate() {}
    protected void firePropertyChange(String propertyName,Object oldValue, Object newValue) {}
    public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}
}

Ou seja, os dados que ele tem em cada célula são Strings e os meus são double e eu ja tentei converter e não tem dado certo. Alguém poderia me ajudar?

7 Respostas

M

Algum erro específico? Ou simplesmente não funciona?

L

Cara… tem que dizer exatamente qual eh o erro que está dando

mas te dou uma dica

verifica no value

o que está passando por ali

System.out.println("Esta passando "+value);

olhe no console… e veja se realmente esta passando valores com " 0,56"… " 1,78"
etc… etc…

pode se que algum valor esteja vindo null

então tera que criar uma condição para tratar isso…

enfim…

para podermos ajuda-lo tens que colocar exatamente qual eh o erro…

abraço

P

Ao meu ver o erro se da na hora da conversão, separei a linha das conversões pra identificar em que parte especificamente estava o erro, deixei a classe assim:

class Colorir extends JLabel implements TableCellRenderer{
    public Component getTableCellRendererComponent(
            JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){                
                String a = value.toString();
                a = a.replaceAll(",", ".");
                double a1 = Double.parseDouble(a);
                if(a1 < 5.0){
                    setForeground(Color.RED);
                }
                else{
                    setForeground(Color.GREEN);
                }
                setText(value.toString());
                return this;
    }
    public void validate() {}
    public void revalidate() {}
    protected void firePropertyChange(String propertyName,Object oldValue, Object newValue) {}
    public void firePr

e o erro é esse:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: empty String
        at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:994)
        at java.lang.Double.parseDouble(Double.java:510)
        at relatorios.RelGeral$Colorir.getTableCellRendererComponent(RelGeral.java:198)
        at javax.swing.JTable.prepareRenderer(JTable.java:5729)
        at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2075)
        at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:1977)
        at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1773)
        at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143)
        at javax.swing.JComponent.paintComponent(JComponent.java:763)
        at javax.swing.JComponent.paint(JComponent.java:1029)
        at javax.swing.JComponent.paintChildren(JComponent.java:864)
        at javax.swing.JComponent.paint(JComponent.java:1038)
        at javax.swing.JViewport.paint(JViewport.java:747)
        at javax.swing.JComponent.paintChildren(JComponent.java:864)
        at javax.swing.JComponent.paint(JComponent.java:1038)
        at javax.swing.JComponent.paintChildren(JComponent.java:864)
        at javax.swing.JComponent.paint(JComponent.java:1038)
        at javax.swing.JComponent.paintChildren(JComponent.java:864)
        at javax.swing.JComponent.paint(JComponent.java:1038)
        at javax.swing.JLayeredPane.paint(JLayeredPane.java:567)
        at javax.swing.JComponent.paintChildren(JComponent.java:864)
        at javax.swing.JComponent.paintToOffscreen(JComponent.java:5131)
        at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:278)
        at javax.swing.RepaintManager.paint(RepaintManager.java:1220)
        at javax.swing.JComponent.paint(JComponent.java:1015)
        at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
        at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
        at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
        at java.awt.Container.paint(Container.java:1780)
        at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814)
        at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)
        at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:694)
        at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
CONSTRUÍDO COM SUCESSO (tempo total: 3 segundos)

Pra mim o erro esta na linha 198 qdo estou tentando converter para double. No exemplo que peguei o conteúdo era String, no meu caso tenho um double armazenado no BD. Resumindo não estou sabendo como fazer isso.

P

É preciso testar a String antes de dar o replace.

Aqui sua String não tem nada, está vazia: empty String

a = a.replaceAll(",", “.”);

P

Resolvi assim:

class Colorir extends JLabel implements TableCellRenderer{
    public Component getTableCellRendererComponent(
            JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){                
                String a = value.toString();
                System.out.println(a);
                a = a.replaceAll(",", ".");
                System.out.println(a);
                if (a != " "){
                    double a1 = Double.parseDouble(a);
                    System.out.println(a);
                    if(a1 < 5.0){
                        setForeground(Color.RED);
                    }
                    else{
                        setForeground(Color.GREEN);
                    }
                    setText(value.toString());
                }
                return this;
    }
    public void validate() {}
    public void revalidate() {}
    protected void firePropertyChange(String propertyName,Object oldValue, Object newValue) {}
    public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}
}

O problema era na segunda vez que o método era chamado, realmente estava vazia a string, e eu estava achando que o ero estava na primeira vez…
vlw pelas dicas…

sf.marcius

cara, nunca duvide do poder da burrice do usuário! :slight_smile:
talvêz teu código seja só para estudos e somente tu irá utilizá-lo, mas vai por mim… é bom a aprender a blindar ele contra usuários…
vc testou tua String contra " ". se o vivente nao digitar nada, ou digitar " " ou digitar "ABC…" vai dar pau.
Use a exception que te retornava então!

class Colorir extends JLabel implements TableCellRenderer{  
     public Component getTableCellRendererComponent(  
             JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){                  
                 String a = value.toString();  
                 a = a.replaceAll(",", ".");  
                 try {
                     double a1 = Double.parseDouble(a);  
                     if(a1 < 5.0) {  
                         setForeground(Color.RED);  
                     } else {  
                         setForeground(Color.GREEN);  
                     }
                     setText(value.toString());  
                 } catch(NumberFormatException ex) {
                      System.out.println("A String dada não é um Double válido: " + a);
                      setForeground(Color.BLACK);
                      setText(""); 
                 }  
                 return this;  
     }  
     public void validate() {}  
     public void revalidate() {}  
     protected void firePropertyChange(String propertyName,Object oldValue, Object newValue) {}  
     public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}  
}

[]S

P

Correto, obg pela dica!!!
mas nesse caso ele ja esta lendo os dados do BD, o lance de digitar qquer coisa eu trato qdo vou inserir. Nesse caso é que minha tabela exibe uma coluna com DÉBITOS e outra com CRÉDITOS, qdo leio no BD se o valor é referente a CRÉDITO a célula da coluna DÉBITO fica vazia… então só tem a possibilidade de ter um double ou o " ". Por isso não me preocupei.

Criado 11 de março de 2010
Ultima resposta 12 de mar. de 2010
Respostas 7
Participantes 5