[RESOLVIDO] Usar NumberFormat com Hora, Minuto e Segundo [JFreeChart]

1 resposta
eliangela

Olá pessoal!

Estou fazendo um gráfico com JFreeChart, usando medições de temperatura de segundo em segundo, ou seja, a cada segundo eu tenho um valor de temperatura diferente.
Esse gráfico é muito extenso, pois eu receberei medições por aproximadamente 4 horas, totalizando 14.400 segundos.

O gráfico em anexo está correto, mas tem um inconveniente: Ao invés de mostrar 1.000, 2.000, 3.000 (...) segundos, eu queria mostrar 1h, 2h, 3h.

Como eu poderia fazer isso usando o NumberFormat?

Esqueci de dizer que tem uma classe que pode ajudar a fazer isso:
ValueAxis domainAxis = plot.getDomainAxis();
domainAxis.setStandardTickUnits(TimeAxis.createTimeTickUnits()); //este código muda o jeito de exibição do DomainAxis
E esta é a classe TimeAxis (copiei ela da classe org.jfree.chart.axis.NumberAxis). Quero fazer isso com as Horas, Minutos e Segundos:
public class TimeAxis {

	public static TickUnitSource createTimeTickUnits() {
        TickUnits units = new TickUnits();
//		SimpleDateFormat format = new SimpleDateFormat("0");
        DecimalFormat dfs = new DecimalFormat("0");
        DecimalFormat dfh = new DecimalFormat("#,##0");
        units.add(new NumberTickUnit(1, dfs, 2));
        units.add(new NumberTickUnit(2, dfs, 2));
        units.add(new NumberTickUnit(5, dfs, 5));
        units.add(new NumberTickUnit(10, dfs, 2));
        units.add(new NumberTickUnit(20, dfs, 2));
        units.add(new NumberTickUnit(60, dfm, 5));
        units.add(new NumberTickUnit(120, dfs, 2));
        units.add(new NumberTickUnit(200, dfs, 2));
        units.add(new NumberTickUnit(500, dfs, 5));
        units.add(new NumberTickUnit(1000, dfh, 2));
        units.add(new NumberTickUnit(2000, dfh, 2));
        units.add(new NumberTickUnit(5000, dfh, 5));
        units.add(new NumberTickUnit(10000, dfh, 2));
        units.add(new NumberTickUnit(20000, dfh, 2));
        units.add(new NumberTickUnit(50000, dfh, 5));
        units.add(new NumberTickUnit(100000, dfh, 2));
        units.add(new NumberTickUnit(200000, dfh, 2));
        units.add(new NumberTickUnit(500000, dfh, 5));
        units.add(new NumberTickUnit(1000000, dfh, 2));
        units.add(new NumberTickUnit(2000000, dfh, 2));
        units.add(new NumberTickUnit(5000000, dfh, 5));
        units.add(new NumberTickUnit(10000000, dfh, 2));
        units.add(new NumberTickUnit(20000000, dfh, 2));
        units.add(new NumberTickUnit(50000000, dfh, 5));
        units.add(new NumberTickUnit(100000000, dfh, 2));
        units.add(new NumberTickUnit(200000000, dfh, 2));
        units.add(new NumberTickUnit(500000000, dfh, 5));
        units.add(new NumberTickUnit[telefone removido], dfh, 2));
        units.add(new NumberTickUnit[telefone removido], dfh, 2));
        units.add(new NumberTickUnit[telefone removido].0, dfh, 5));
        units.add(new NumberTickUnit[telefone removido].0, dfh, 2));
        return units;
    }

}

1 Resposta

eliangela
Resolvi assim:
public class TimeAxis {

	public static TickUnitSource createTimeTickUnits() {
        TickUnits units = new TickUnits();
		TimeFormat format = new TimeFormat();
        units.add(new NumberTickUnit(1, format, 2));
        units.add(new NumberTickUnit(2, format, 2));
        units.add(new NumberTickUnit(5, format, 5));
        units.add(new NumberTickUnit(15, format, 2));
        units.add(new NumberTickUnit(30, format, 2));
        units.add(new NumberTickUnit(60, format, 5));
        units.add(new NumberTickUnit(120, format, 2));
        units.add(new NumberTickUnit(240, format, 2));
        units.add(new NumberTickUnit(540, format, 5));
        units.add(new NumberTickUnit(1080, format, 2));
        units.add(new NumberTickUnit(2160, format, 2));
        units.add(new NumberTickUnit(3600, format, 2));
        units.add(new NumberTickUnit(5400, format, 5));
        units.add(new NumberTickUnit(10800, format, 2));
        units.add(new NumberTickUnit(21600, format, 2));
        units.add(new NumberTickUnit(36000, format, 2));
        units.add(new NumberTickUnit(54000, format, 5));
        units.add(new NumberTickUnit(72000, format, 5));
        return units;
    }

}
public class TimeFormat extends NumberFormat {

	public TimeFormat(String pattern) {
	}

	public TimeFormat() {
	}

	@Override
	public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) {
		StringBuffer sb = new StringBuffer();

		double min = number / 60D;
		if (min < 1) {
			sb.append((int) number).append("s");
		} else {
			double hora = min / 60;
			if (hora < 1) {
				sb.append((int) min).append("m");
			} else {
				min = min % 60;
				sb.append((int) hora).append("h").append((int) min).append("m"); //Tenho que terminar aqui ainda... não está completo!
			}
		}

		return sb;
	}

	@Override
	public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) {
		throw new UnsupportedOperationException("Not supported yet.");
	}

	@Override
	public Number parse(String source, ParsePosition parsePosition) {
		throw new UnsupportedOperationException("Not supported yet.");
	}
}

A classe TimeFormat não está completa ainda, mas essa que é a idéia!

Abraços!

Criado 15 de agosto de 2011
Ultima resposta 15 de ago. de 2011
Respostas 1
Participantes 1