Bom dia.
Recentemente trabalhando com gráficos no JFreeChart eu precisava de alguma forma mudar em tempo de execução a cor das séries do gráfico, então criei uma aplicação pra isso e coloquei ela no Popup Menu do ChartPanel.
Ela funciona perfeitamente como eu queria, ela exibe para cada série um JLabel com o nome, um JLabel com a cor atual da Série, e um JButton que abre um ColorChooser e retorna a cor desejada. Esta cor é colocada no JLabel de cor da série, também no Renderer da série e é atualizado o gráfico para mostrar a nova cor.
Porém, para funcionar de forma dinâmica de acordo com o número de séries eu faço a criação dos components e a adição do Listener do JButton em um laço de repetição, iterando sobre o número de ítens do DataSet. Segue abaixo o código:
for (int i = 0; i < dataset.getRowCount(); i++) {
int index = i;
JLabel lblNome = new JLabel(dataset.getRowKey(i).toString());
panel.add(lblNome);
JLabel lblCor = new JLabel();
lblCor.setOpaque(true);
lblCor.setBackground((Color) renderer.getSeriesPaint(i));
lblCor.setBorder(BorderFactory.createLineBorder(Color.BLACK));
panel.add(lblCor, "width 50!, height 20!");
JButton button = new JButton("Mudar Cor");
panel.add(button);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Color color = JColorChooser.showDialog(null, "Selecione a Cor Desejada", lblCor.getBackground());
if (color != null) {
setColor(lblCor, color, renderer, index);
chart.fireChartChanged();
}
}
});
}
private static void setColor(JLabel label, Color color, LineAndShapeRenderer renderer, int index) {
label.setBackground(color);
renderer.setSeriesPaint(index, color);
}
Ele funciona corretamente mas minha dúvida é:
Como o actionPerformed() sabe quais os componentes à serem passados para o setColor() de acordo com a série, mesmo sendo chamado após toda a execução e fora do laço de repetição?