Então, se você utilizar adequadamente o ComboBoxModel
para renderizar os itens dos seus JComboBoxes
e tirar esse monte de inteligência da tela e deixar ela nas classes adequadas, tudo fica mais fácil de manter.
Não sei como está seu código completo, mas vamos supor que você tenha as classes Filme
, Sala
e Sessao
parecidas com as classes abaixo.
Classe Filme
:
public class Filme {
private String nome;
public Filme(String nome) {
this.nome = nome;
}
public String getNome() {
return nome;
}
@Override
public int hashCode() {
return nome == null ? 0 : nome.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof Filme) {
Filme that = (Filme) obj;
if (this.nome == null) {
return that.nome == null;
}
return this.nome.equals(that.nome);
}
return false;
}
}
Classe Sala
:
import java.util.LinkedList;
import java.util.List;
public class Sala {
private String nome;
private Filme filme;
private List<Sessao> sessoes = new LinkedList<>();
public Sala(String nome) {
this.nome = nome;
}
public void addSessao(Sessao sessao) {
sessoes.add(sessao);
}
public Filme getFilme() {
return filme;
}
public String getNome() {
return nome;
}
public List<Sessao> getSessoes() {
return sessoes;
}
public void setFilme(Filme filme) {
this.filme = filme;
}
@Override
public int hashCode() {
return nome == null ? 0 : nome.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof Sala) {
Sala that = (Sala) obj;
if (this.nome == null) {
return that.nome == null;
}
return this.nome.equals(that.nome);
}
return false;
}
}
Classe Sessao
:
public class Sessao {
private String horario;
public Sessao(String horario) {
this.horario = horario;
}
public String getHorario() {
return horario;
}
@Override
public int hashCode() {
return horario == null ? 0 : horario.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof Sessao) {
Sessao that = (Sessao) obj;
if (this.horario == null) {
return that.horario == null;
}
return this.horario.equals(that.horario);
}
return false;
}
}
E uma classe Cinema
com funcionalidades parecidas com as da classe abaixo:
import java.util.LinkedList;
import java.util.List;
public class Cinema {
// Exemplo hipotético de inicialização
// No mundo real você vai ler isso de uma base de dados
public static Cinema inicializar() {
Sessao sessao1 = new Sessao("15:00");
Sessao sessao2 = new Sessao("15:30");
Sessao sessao3 = new Sessao("16:00");
Sessao sessao4 = new Sessao("16:30");
Sessao sessao5 = new Sessao("17:00");
Sessao sessao6 = new Sessao("17:30");
Sessao sessao7 = new Sessao("18:00");
Sessao sessao8 = new Sessao("18:30");
Sessao sessao9 = new Sessao("19:00");
Filme filme1 = new Filme("Jon Wick 3");
Filme filme2 = new Filme("Rambo V");
Filme filme3 = new Filme("Vingadores Ultimato");
Sala sala1 = new Sala("Sala 1");
sala1.setFilme(filme1);
sala1.addSessao(sessao1);
sala1.addSessao(sessao3);
sala1.addSessao(sessao5);
sala1.addSessao(sessao7);
sala1.addSessao(sessao9);
Sala sala2 = new Sala("Sala 2");
sala2.setFilme(filme2);
sala2.addSessao(sessao2);
sala2.addSessao(sessao4);
sala2.addSessao(sessao5);
sala2.addSessao(sessao6);
sala2.addSessao(sessao8);
Sala sala3 = new Sala("Sala 3");
sala3.setFilme(filme3);
sala3.addSessao(sessao2);
sala3.addSessao(sessao3);
sala3.addSessao(sessao4);
sala3.addSessao(sessao5);
sala3.addSessao(sessao7);
Sala sala4 = new Sala("Sala 4");
sala4.setFilme(filme2);
sala4.addSessao(sessao3);
sala4.addSessao(sessao4);
sala4.addSessao(sessao6);
sala4.addSessao(sessao7);
sala4.addSessao(sessao9);
Sala sala5 = new Sala("Sala 5");
sala5.setFilme(filme1);
sala5.addSessao(sessao1);
sala5.addSessao(sessao2);
sala5.addSessao(sessao5);
sala5.addSessao(sessao8);
sala5.addSessao(sessao9);
Cinema cinema = new Cinema();
cinema.addSala(sala1);
cinema.addSala(sala2);
cinema.addSala(sala3);
cinema.addSala(sala4);
cinema.addSala(sala5);
return cinema;
}
private List<Sala> salas = new LinkedList<>();
private Cinema() {}
public void addSala(Sala sala) {
salas.add(sala);
}
public List<Filme> getFilmes() {
List<Filme> todosOsFilmes = new LinkedList<>();
for (Sala sala : salas) {
Filme filme = sala.getFilme();
if (todosOsFilmes.contains(filme)) {
continue;
}
todosOsFilmes.add(filme);
}
return todosOsFilmes;
}
public List<Sala> getSalas() {
return salas;
}
public List<Sala> pesquisarSalaPorFilme(String nomeDoFilme) {
List<Sala> encontradas = new LinkedList<>();
for (Sala sala : salas) {
if (encontradas.contains(sala)) {
continue;
}
Filme filme = sala.getFilme();
if (nomeDoFilme.equals(filme.getNome())) {
encontradas.add(sala);
}
}
return encontradas;
}
public List<Sessao> pesquisarSessaoPorSala(String nomeDaSala) {
for (Sala sala : salas) {
if (nomeDaSala.equals(sala.getNome())) {
return sala.getSessoes();
}
}
return new LinkedList<>();
}
}
Agora, com todas as estruturas básicas preparadas, fica bem mais fácil implementar a sua tela.
Veja o exemplo abaixo:
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.UIManager;
@SuppressWarnings("serial")
public class TelaExemplo extends JFrame {
/**
* Ponto de entrada do programa
*/
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
TelaExemplo tela = new TelaExemplo();
tela.setDefaultCloseOperation(EXIT_ON_CLOSE);
tela.setLocationRelativeTo(null);
tela.setVisible(true);
} catch (Throwable t) {
t.printStackTrace();
}
}
/**
* ComboBoxModel interno utilizado para renderizar a coleção de filmes
*/
private class ComboBoxModelFilme extends DefaultComboBoxModel<String> {
private List<Filme> filmes;
ComboBoxModelFilme(List<Filme> filmes) {
this.filmes = filmes;
}
@Override
public int getSize() {
return filmes.size();
}
@Override
public String getElementAt(int index) {
Filme filme = filmes.get(index);
return filme.getNome();
}
}
/**
* ComboBoxModel interno utilizado para renderizar a coleção de salas
*/
private class ComboBoxModelSala extends DefaultComboBoxModel<String> {
private List<Sala> salas;
ComboBoxModelSala(List<Sala> salas) {
this.salas = salas;
}
@Override
public int getSize() {
return salas.size();
}
@Override
public String getElementAt(int index) {
Sala sala = salas.get(index);
return sala.getNome();
}
}
/**
* ComboBoxModel interno utilizado para renderizar a coleção de sessões
*/
private class ComboBoxModelSessao extends DefaultComboBoxModel<String> {
private List<Sessao> sessoes;
ComboBoxModelSessao(List<Sessao> sessoes) {
this.sessoes = sessoes;
}
@Override
public int getSize() {
return sessoes.size();
}
@Override
public String getElementAt(int index) {
Sessao sessao = sessoes.get(index);
return sessao.getHorario();
}
}
private final Cinema cinema;
private JComboBox<String> boxFilme;
private JComboBox<String> boxSala;
private JComboBox<String> boxSessao;
/**
* Construtor da tela
*/
public TelaExemplo() {
super("Tela de Exemplo");
Dimension tamanho = new Dimension(640, 480);
setMinimumSize(tamanho);
boxFilme = new JComboBox<>();
boxFilme.setPreferredSize(new Dimension(150, 30));
boxFilme.addActionListener(event -> atualizaComboSala());
boxSala = new JComboBox<>();
boxSala.setPreferredSize(new Dimension(100, 30));
boxSala.addActionListener(event -> atualizaComboSessao());
boxSessao = new JComboBox<>();
boxSessao.setPreferredSize(new Dimension(80, 30));
Container container = getContentPane();
container.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10));
container.add(boxFilme);
container.add(boxSala);
container.add(boxSessao);
cinema= Cinema.inicializar();
atualizaComboFilme();
}
private void atualizaComboFilme() {
List<Filme> filmes = cinema.getFilmes();
boxFilme.setModel(new ComboBoxModelFilme(filmes));
boxFilme.setSelectedIndex(0);
atualizaComboSala();
}
private void atualizaComboSala() {
String nomeDoFilme = (String) boxFilme.getSelectedItem();
List<Sala> salas = cinema.pesquisarSalaPorFilme(nomeDoFilme);
boxSala.setModel(new ComboBoxModelSala(salas));
boxSala.setSelectedIndex(0);
atualizaComboSessao();
}
private void atualizaComboSessao() {
String nomeDaSala = (String) boxSala.getSelectedItem();
List<Sessao> sessoes = cinema.pesquisarSessaoPorSala(nomeDaSala);
boxSessao.setModel(new ComboBoxModelSessao(sessoes));
boxSessao.setSelectedIndex(0);
}
}