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?