Da forma como esta, se você selecionar 20 vezes, vai somar as vinte vezes.
Minha avaliação é que não é bom usar o combobox para ficar atualizando algo.
O ideal é selecionar e usar um botão para confirmar a atualização do status.
Você pode criar uma lista a parte para ver quem foi atualizado e controlar o limite de atualizações.
Vou apresentar um exemplo, sem muito comprometimento, necessitando de algumas fatorações, considerando a situação atual:
package gamer;
import java.awt.BorderLayout;
import java.awt.event.ItemEvent;
import java.util.HashSet;
import java.util.Set;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
public class Teste {
private final static Set<Heroi> ATUALIZADO = new HashSet<>();
public static void main(String[] args) {
JFrame frame = new JFrame("Teste combobox");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 400);
frame.setLayout(new BorderLayout(15, 15));
JComboBox heroi = new JComboBox(new DefaultComboBoxModel(new Object[]{"Selecione um Heroi", new Hazuma(), new Kahara(), new Kamia()}));
frame.add(heroi, BorderLayout.NORTH);
heroi.addItemListener(evt -> {
if (evt.getStateChange() == ItemEvent.SELECTED && heroi.getSelectedIndex() > 0) {
Heroi heroiSelecionado = (Heroi) heroi.getSelectedItem();
if (ATUALIZADO.add(heroiSelecionado) || heroiSelecionado.getClass() != Hazuma.class) {
System.out.println(heroiSelecionado.getNome() + " -> Habilidade: " + heroiSelecionado.getHabilidade().getNome() + " status: " + heroiSelecionado.getHabilidade().getValor());
heroiSelecionado.getHabilidade().restaurar();
System.out.println("Restauração realizada, status: " + heroiSelecionado.getHabilidade().getValor());
heroiSelecionado.getHabilidade().executar();
}
}
});
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setVisible(true);
}
}
package gamer;
abstract class Heroi {
private String nome;
private Habilidade habilidade;
private double poder;
Heroi(Habilidade habilidade){
this.nome = getClass().getSimpleName();
this.habilidade = habilidade;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public double getPoder() {
return poder;
}
public void setPoder(double poder) {
this.poder = poder;
}
public Habilidade getHabilidade() {
return habilidade;
}
public void setHabilidade(Habilidade habilidade) {
this.habilidade = habilidade;
}
@Override
public String toString() {
return this.nome;
}
}
package gamer;
class Hazuma extends Heroi{
public Hazuma() {
super(new Imortal());
}
}
package gamer;
class Kahara extends Heroi{
public Kahara() {
super(new Velocidade());
}
}
package gamer;
class Kamia extends Heroi{
public Kamia() {
super(new Voar());
}
}
package gamer;
public abstract class Habilidade {
double valor;
final double restauracao;
final double valorMin;
private String nome;
public Habilidade(double valor, double restauracao) {
this.valor = valor;
this.valorMin = valor/10;
this.restauracao = restauracao;
this.nome = getClass().getSimpleName();
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
protected void restaurar(){
valor+= restauracao;
}
protected void restaurar(double valor){
if (this.valor < this.valorMin) {
valor+= valor;
}
}
public abstract boolean ativa();
public abstract void executar();
public double getValor(){
return valor;
}
}
package gamer;
public class Imortal extends Habilidade {
public Imortal() {
super(80, 20);
}
@Override
public void executar() {
if (ativa()) {
System.out.println("Reviver");
}
}
@Override
public boolean ativa() {
restaurar(1);
return valor > 5;
}
}
package gamer;
public class Velocidade extends Habilidade {
public Velocidade() {
super(20,5);
}
@Override
public void executar() {
if (ativa()) {
System.out.println("More Fast");
}
}
@Override
public boolean ativa() {
restaurar(1);
return valor > 4;
}
}
package gamer;
public class Voar extends Habilidade {
public Voar() {
super(300,15);
}
@Override
public void executar() {
if (ativa()) {
System.out.println("Voando");
}
}
@Override
public boolean ativa() {
restaurar(2);
return valor > 15;
}
}
Observe que pode ser criado um personagem que durante o jogo, pode assimilar uma habilidade de outro personagem, fazendo uso do seuHeroi.setHabilidade(novaHabilidade), ou ter uma arvore de habilidades a depender da sua arquitetura.