Recuperar todos os anos

12 respostas
Flavio_Luiz

Alguém sabe como faço para recuperar todos os anos ?
Ou pelo menos um periodo de anos… de 1990 a 2009…

12 Respostas

ViniGodoy

Não tem como, os anos que se foram não voltam mais. Só se pode trabalhar agora para o futuro…

hehehehe, brincaideras a parte, o que você quer dizer com “recuperar os anos”?

E
for (int i = 1990; i <= 2009; ++i) {
}
Flavio_Luiz

é simples… preciso criar uma combo de anos…
mas ñ queria fazer um laço…
acredito que tenha outras formas de fazer isso…
Utilizando Calendar ou Date…

E

O jeito mais fácil é um laço mesmo. Não complique as coisas.

fabiofalci

Não acha que essa combo vai ficar extensa? Usa um text field mesmo.

Flavio_Luiz

eu ñ to querendo complicar nd ñ…
a questão é q estamos em 2009, conseqüentemente ano vem é 2010
e a minha combo ñ vai ter 2010…
é claro eu poderia recuperar o ano em q estou e fazer o laço até o ano…
mas… ñ quero fazer isso…

fabiofalci

Só ajustar qts anos pra trás vc quer

int current = Calendar.getInstance().get(Calendar.YEAR);
for (int i = current - 10; i <= current; i++) {
	System.out.println("Ano: " + i);
}

Agora, se o usuário quer colocar 1980, não vai aparecer na combo

ViniGodoy

O que vc tem contra os laços?

fabiofalci

Hahahaha, pois é, boa pergunta. Façamos sem laço então!

public void testYears() {
	List<Integer> list = new ArrayList<Integer>();
	int max = 10;
	nextYears(list, max, Calendar.getInstance().get(Calendar.YEAR));
	System.out.println(list);
}

public void nextYears(List<Integer> list, int max, int current) {
	if (list.size() == max) {
		return;
	}
	list.add(current--);
	nextYears(list, max, current);
}
ViniGodoy

Existe uma forma de fazer isso criando um ComboBoxModel próprio. Evita também a recursão. Como não tenho eclipse e nem java aqui no trabalho, não posso testar. Mas em casa elaboro algo e posto aqui…

ViniGodoy

Bom, conforme prometido:

import java.awt.EventQueue;
import java.util.Calendar;

import javax.swing.AbstractListModel;
import javax.swing.ComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;

public class FrameTeste extends JFrame {

	public FrameTeste() {
		super("Ano");
		setSize(100, 60);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		int anoAtual = Calendar.getInstance().get(Calendar.YEAR);
		add(new JComboBox(new AnoComboboxModel(anoAtual, 1980)));
	}

	public static void main(String[] args) {
		final FrameTeste frame = new FrameTeste();
		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
				frame.setVisible(true);
			}
		});
	}
}

class AnoComboboxModel extends AbstractListModel implements ComboBoxModel
{	
	private int anoFinal;
	private int anoInicial;
	private int selected;
	
	public AnoComboboxModel(int anoInicial, int anoFinal)
	{
		this.anoInicial = anoInicial;
		this.anoFinal = anoFinal;
		this.selected = anoInicial;
	}
	
	@Override
	public Object getSelectedItem() {
		return selected;
	}

	@Override
	public void setSelectedItem(Object anItem) {
		if (anItem instanceof Integer)
			selected = ((Integer)anItem).intValue();		
	}

	@Override
	public Object getElementAt(int index) {		
		return anoInicial + (anoInicial < anoFinal ? index : -index);
	}

	@Override
	public int getSize() {
		return Math.abs(anoInicial - anoFinal)+1;
	}
}

Você pode inverter os parâmetros de entrada dos anos para que a combo liste-os na ordem inversa. Aí no exemplo estou listando do ano atual até o ano de 1980. Evita um laço (que na verdade fica implícito, dentro da combo), recursão e até a existência de um List para guardar os valores. E também não usa Calendar ou Date, a não ser para pegar o ano atual.

fabiofalci

Boa Vini! Acho que agora não temos como retrucar essa solução né!?!?! Kudos for you :wink:

Criado 20 de outubro de 2009
Ultima resposta 21 de out. de 2009
Respostas 12
Participantes 4