Relacionar componentes em paineis diferentes

Então, o problema eu seguinte:
O meu programa tem um JTabPane onde tem 4 abas cada um com um painel diferente, onde nesse painel existe uma quantidade indeterminada de subpaineis, e nesse subpainel tenho mais um painel dentro dele que são os botões de opção que quando apertados a imagem eh mudada, por exemplo o botão de favorito é apertado, então ele irá atualizar a imagem para outra, o que eu precisava é o seguinte…
Eu queria interligar esses subpaineis, pois na teoria eles são os mesmos em todas as abas, para que caso o usuario esteja em uma determinada aba e modifique um determinado componente(aperte em favoritos por exemplo) nessa aba, as outras abas sejam atualizadas juntas(ou seja mudaram também as imagens do botão favoritos) mas sem eu ter que refazer o painel inteiro, pois iria crashar por um tempo ate q ele seja refeito;
Por exemplo:
tenho 4 abas->Pokemons, favoritos,capturados,desejados
Estou na aba favoritos, e aperto o botão para retirar dos desejados, ate ai ok, na aba favoritos realmente sera refeito o botão,mas nas outras não.

Eu ja tenho o codigo de como refazer sem ter q reiniciar o frame inteiro.
Alguém pode me ajudar pf? estou um tanto quanto desesperado, pois é um projeto da escola e o prazo ta acabando. klkkkkk

Aqui está o cod(basicamente eh so a classe botao e a parte de atualizar na classe PaineisTelaInicial):

public class PaineisTelaInicial extends JPanel{

	private Dimension dimension;

	private JPanel painelTemporarioBL, painelTemporarioFL;
	private int x,y;
	private GridBagConstraints c;
	private int columns;
	
	public PaineisTelaInicial(Dimension dimension, int idUsuario) {

        this.dimension = dimension;
        
        this.x = 0;
        this.y = 0;
        
        this.columns = (int) Math.floor(this.dimension.getWidth()/168);
        setLayout(new GridBagLayout());
        
	}
	
	public void atualizar(Pokemon poke,int ind, int idUsuario, GridBagConstraints c, JPanel comp, TelaInicial tela) throws SQLException {
		
		this.c = c;
		
		remove(comp);
		listaOsPokemons(poke, idUsuario, tela);
		addPaineis();
	}
	
	public void acrescentaXY() {
		if(this.x == this.columns-1) {
			this.x = 0;
			this.y += 1;
			
		}else {
			this.x+=1;
		}
	}
	public JScrollPane criaScrollPane() {
		
		JScrollPane scrollPane = new JScrollPane(this);
		scrollPane.setViewportView(this);
		
		int width = (int) this.dimension.getWidth();
		int height = (int) this.dimension.getHeight() - 64;
		
		scrollPane.setPreferredSize(new Dimension(width, height));
        
    	return scrollPane;
    }
	
	public void criaPainelTemporarioFlowLayout() {
		this.painelTemporarioFL = new JPanel();
	}
	
	public void criaPainelTemporarioBorderLayout() {
    	this.painelTemporarioBL = new JPanel();
    	this.painelTemporarioBL.setLayout(new BorderLayout());
    }
	
	public void criaBotoes(Image img, Pokemon poke, int idUsuario,TelaInicial tela) throws SQLException{
		Botoes bts = new Botoes(tela);
		
		this.painelTemporarioBL.add(bts.criaJButtonPokemon(img, poke), BorderLayout.CENTER);
		this.painelTemporarioFL.add(bts.criaBotaoAddFavoritos(poke, idUsuario, this.c, this.painelTemporarioBL));
		this.painelTemporarioFL.add(bts.criaBotaoAddCapturados(poke, idUsuario, this.c));
		this.painelTemporarioFL.add(bts.criaBotaoAddDesejos(poke, idUsuario, this.c));
		
	}
	
	public void addPaineis() {

		this.painelTemporarioBL.add(this.painelTemporarioFL, BorderLayout.SOUTH);
		add(this.painelTemporarioBL,this.c);
		
	}
	
	public void addPaineis(int indicePosic) {
		this.painelTemporarioBL.add(this.painelTemporarioFL, BorderLayout.SOUTH);
		add(this.painelTemporarioBL,indicePosic);
	}
	
	public void configuraConstraint() {
		this.c = new GridBagConstraints();
		
		this.c.anchor = GridBagConstraints.FIRST_LINE_START;
		
		this.c.insets = new Insets(12,13,13,12);
		
		this.c.gridx = this.x;
		this.c.gridy = this.y;
		
		this.c.weighty = y;
		
	}
	public void listaOsPokemons(Pokemon poke, int idUsuario,TelaInicial tela) throws SQLException{
		
		acrescentaXY();
    	
    	Image img = new Imagem().setNewImg(poke.getId(), 140, 140);

		criaPainelTemporarioBorderLayout();
		criaPainelTemporarioFlowLayout();
		
		criaBotoes(img, poke, idUsuario,tela);
	}
}


public class Botoes{
    
	private TelaInicial tela;
	
	public Botoes(TelaInicial tela) {
		
		this.tela = tela;
		
	}
    public JButton criaJButtonPokemon(Image img, Pokemon poke) {
    	
    	JButton botaoPoke = new JButton();
        botaoPoke.setIcon(new ImageIcon(img));
        
        ActionListener callEspecPoke = new ActionListener() {
        	public void actionPerformed(ActionEvent e) {
        		System.out.println(poke.getNome());
        	}
        };
        botaoPoke.addActionListener(callEspecPoke);
        
        return botaoPoke;
    	
    }
    
    public JButton criaBotaoAddFavoritos(Pokemon poke, int idUsuario, GridBagConstraints c, JPanel comp) throws SQLException{
    	
    	JButton btAddFavoritos = new JButton();
    	
		btAddFavoritos.setIcon(new ImageIcon(new Imagem().setNewImg(new FavoritosUsuarioDAO().selecionaPokemonFromFavoritosByUserAndPoke(idUsuario, poke.getId()), "Favorito", 20, 20 )));
    	
    	
    	btAddFavoritos.setToolTipText("Adicionar/Retirar dos Favoritos");
    	
    	ActionListener acListener = new ActionListener() {
    		public void actionPerformed(ActionEvent e) {
    			try {
    				boolean adicionado = new FavoritosUsuarioDAO().selecionaPokemonFromFavoritosByUserAndPoke(idUsuario, poke.getId());
    				
    				if(adicionado) {
    					adicionado = false;
    					new FavoritosUsuarioDAO().retiraPokemonEmFavoritos(poke.getId(), idUsuario);
    					btAddFavoritos.setIcon(new ImageIcon(new Imagem().setNewImg(adicionado, "Favorito", 20, 20 )));
    				}
    				else {
    					adicionado = true;
    					new FavoritosUsuarioDAO().inseriPokemonEmFavoritos(poke.getId(), idUsuario);
    					btAddFavoritos.setIcon(new ImageIcon(new Imagem().setNewImg(adicionado, "Favorito", 20, 20 )));
    				}
    				
    				tela.atualizaFrame(poke, c, comp);
					
				} catch (SQLException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
    		}
    	};
    	
    	btAddFavoritos.addActionListener(acListener);
    	
    	return btAddFavoritos;
    }
    
    public JButton criaBotaoAddCapturados(Pokemon poke, int idUsuario, GridBagConstraints c) throws SQLException {
    	JButton btAddCapturados = new JButton();
        
    	btAddCapturados.setIcon(new ImageIcon(new Imagem().setNewImg( new CapturadosUsuarioDAO().selecionaPokemonFromCapturadosByUserAndPoke(idUsuario, poke.getId()), "Capturado", 20, 20 )));
    	btAddCapturados.setToolTipText("Adicionar/Retirar dos capturados");
    	
    	ActionListener acListener = new ActionListener() {
    		public void actionPerformed(ActionEvent e) {
    			try {
    				boolean adicionado = new CapturadosUsuarioDAO().selecionaPokemonFromCapturadosByUserAndPoke(idUsuario, poke.getId());
    				
    				if(adicionado) {
    					adicionado = false;
    					new CapturadosUsuarioDAO().retiraPokemonEmCapturados(poke.getId(), idUsuario);
    					btAddCapturados.setIcon(new ImageIcon(new Imagem().setNewImg(adicionado, "Capturado", 20, 20 )));
    				}
    				else {
    					adicionado = true;
    					new CapturadosUsuarioDAO().inseriPokemonEmCapturados(poke.getId(), idUsuario);
    					btAddCapturados.setIcon(new ImageIcon(new Imagem().setNewImg(adicionado, "Capturado", 20, 20 )));
    				}
    				
    				
				} catch (SQLException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
    		}
    	};
    	
    	btAddCapturados.addActionListener(acListener);
    	
    	return btAddCapturados;
    }
    
    public JButton criaBotaoAddDesejos(Pokemon poke, int idUsuario, GridBagConstraints c) throws SQLException {
    	JButton btAddDesejos = new JButton();
        
    	btAddDesejos.setIcon(new ImageIcon(new Imagem().setNewImg(new DesejadosUsuarioDAO().selecionaPokemonFromDesejadosByUserAndPoke(idUsuario, poke.getId()), "Desejado", 20, 20 )));
    	btAddDesejos.setToolTipText("Adicionar/Retirar dos desejados");
    	
    	ActionListener acListener = new ActionListener() {
    		public void actionPerformed(ActionEvent e) {
    			try {
    				boolean adicionado = new DesejadosUsuarioDAO().selecionaPokemonFromDesejadosByUserAndPoke(idUsuario, poke.getId());
    				
    				if(adicionado) {
    					adicionado = false;
    					new DesejadosUsuarioDAO().retiraPokemonEmDesejados(poke.getId(), idUsuario);
    					btAddDesejos.setIcon(new ImageIcon(new Imagem().setNewImg(adicionado, "Desejado", 20, 20 )));
    				}
    				else {
    					adicionado = true;
    					new DesejadosUsuarioDAO().inseriPokemonEmDesejados(poke.getId(), idUsuario);
    					btAddDesejos.setIcon(new ImageIcon(new Imagem().setNewImg(adicionado, "Desejado", 20, 20 )));
    				}
    				
    				
					
				} catch (SQLException e1) {
					e1.printStackTrace();
				}
    		}
    	};
    	
    	btAddDesejos.addActionListener(acListener);
    	
    	return btAddDesejos;
    }
}


public class TelaInicial extends JFrame{
    
	private Dimension dimension;
	private int idUsuario = 1;
	private JTabbedPane jtp;
	private ListaDePokemons pkLista;
	private PaineisTelaInicial[] paineis = new PaineisTelaInicial[4];
	private GridBagConstraints c;
	
    public TelaInicial() throws SQLException{
        super("Pokédex");
        
        this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        this.setSizeJFrame();
        this.setLocationRelativeTo(null);
        this.getContentPane().setLayout(new BorderLayout());
        
    	this.jtp = new JTabbedPane();
        add(this.jtp,BorderLayout.NORTH);
        
        criaLista();
        criaPaineis();
        criaAbas();
        addOnTabPane();
        
        setVisible(true);
    }
    
    public void atualizaFrame(Pokemon poke, GridBagConstraints c, JPanel comp) throws SQLException {
    	
    	paineis[0].atualizar(poke, poke.getId()-1, idUsuario, c, comp, this);

    	this.repaint();
    }
    
    public void setSizeJFrame() {
    	DisplayMode tamanho = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDisplayMode();
    	int width = (int) (tamanho.getWidth()/1.7);
    	int height = (int) (tamanho.getHeight()/1.1);
    	this.dimension = new Dimension(width, height);
    	
    	this.setSize(this.dimension);
    }
    
    
    public void criaLista() throws SQLException {
    	this.pkLista = new ListaDePokemons(new PokemonDAO().selecionaAllPokemons());
    }
    
    public void criaPaineis() {

    	for(int i =0; i<4; i++) {
    		this.paineis[i] = new PaineisTelaInicial( this.dimension ,this.idUsuario);
    		}
    }
    
    public void criaAbas() throws SQLException {
    	this.c = new GridBagConstraints();
    	
    	this.c.weightx = 1;
    	this.c.weighty = 1;
    	
    	this.c.fill = GridBagConstraints.BOTH;
    	
    	JPanel stretch = new JPanel();
    	for(Pokemon poke: pkLista.getLista()) {
    		

    		paineis[0].configuraConstraint();
    		paineis[0].listaOsPokemons(poke, this.idUsuario, this);
    		paineis[0].addPaineis();
    		
    		Adicionar(poke);
    	}
    	
    	double width = this.dimension.getWidth()/168;
    	
    	for(PaineisTelaInicial painel: paineis) {
	    	
    		if (painel.getComponentCount() < width) {
	    		painel.add(stretch, this.c);
    		}
    	}
    }
    
    public void Adicionar(Pokemon poke) throws SQLException {
    	
    	if(new DesejadosUsuarioDAO().selecionaPokemonFromDesejadosByUserAndPoke(this.idUsuario, poke.getId())) {
    		paineis[1].configuraConstraint();
    		paineis[1].listaOsPokemons(poke, this.idUsuario, this);
    		paineis[1].addPaineis();
    	}
		if(new FavoritosUsuarioDAO().selecionaPokemonFromFavoritosByUserAndPoke(this.idUsuario, poke.getId())) {
			paineis[2].configuraConstraint();
			paineis[2].listaOsPokemons(poke, this.idUsuario, this);
			paineis[2].addPaineis();
    	}
		if(new CapturadosUsuarioDAO().selecionaPokemonFromCapturadosByUserAndPoke(this.idUsuario, poke.getId())) {
			paineis[2].configuraConstraint();
			paineis[3].listaOsPokemons(poke, this.idUsuario, this);
			paineis[3].addPaineis();
    	}
    }
    
    public void addOnTabPane() {
    	
    	this.jtp.addTab("Pokemons", paineis[0].criaScrollPane());
    	this.jtp.add("Desejados", paineis[1].criaScrollPane());
    	this.jtp.add("Favoritos", paineis[2].criaScrollPane());
    	this.jtp.add("Capturados", paineis[3].criaScrollPane());
    	
    }
}

Até onde sei, não é possível. Você vai precisar disparar um evento para atualizar os frames, mais cedo ou mais tarde.
Algumas soluções possíveis:

  • Informar ao usuário que a alteração estará vigente na próxima vez que acessar o sistema (e aí você só se preocupa em armazenar a alteração e, ao abrir novamente o sistema, já renderizar com a nova configuração). Este é o meio mais utilizado.
  • Tentar fazer isso conforme vai abrindo as abas. Faz na atual (que levaria menos tempo) e, quando uma outra aba for selecionada, faz isso nela.
1 curtida

Obrigado, essas soluções me ajudaram