Interface Gráfica e Multithreading: um grande problema pela frente

6 respostas
renatoes

Olá amigos,

Minha dúvida se divide em diversas outras, então vou focar nas principais. Tenho um trabalho para a faculdade onde devo fazer um simulador de Sistema Operacional. A lógica do programa já está feita, mas a interface gráfica está sendo o problema. Devo representar diversos elementos que compõem o sistema operacional e outros elementos do computador de forma gráfica; por exemplo, a memória deve ser o desenho de uma caixa com algumas divisões, e cada divisão sendo um espaço da memória. Daí surgem diversos dúvidas:

  • Como fazer elementos gráficos ficarem sempre do mesmo tamanho (tanto painéis quanto o frame principal que exibirá o simulador)?
  • Como atualizar, através do uso de threads, esses elementos gráficos? Já fiz algumas aplicações GUI com Multithreading mas nada que beirasse a complexidade dos elementos desse trabalho (deve haver no mínimo 10 elementos gráficos a serem desenhados, especialmente filas).
  • Como fazer um (ou mais) painel(éis) ocupar(em) uma posição específica, sem que ele(s) possa(m) ser redimensionado(s)?

Se alguém puder me envie um exemplo ou código que exemplifique principalmente o uso de threads (principalmente em casos onde a interface é atualizada pelo uso de uma thread).

Abraços, e boa noite

6 Respostas

M

ja tentou usar paint(Graphics g) ?

renatoes

Sim
o problema não está no paint, e sim na hierarquia de painéis a serem pintados em um outro painel.

renatoes

Pessoal, boa noite

Infelizmente não consegui até agora realizar esse trabalho, mas agradeço a colaboração de quem leu este tópico. Bom, vou tentar explicar melhor o problema. Tenho um classe Conteudo, que extende Painel
public class Conteudo extends JPanel {

	private String conteudo;
	
	public void setConteudo(String conteudo){
		this.conteudo = conteudo;
		this.setSize(80, 15);
		this.setBorder(BorderFactory.createLineBorder(Color.BLACK));
	}
	
	public void paintComponent(Graphics g){
		
		g.drawRect(0, 0, 80, 15);
		if(conteudo!= null)g.drawString(conteudo, 20, 7);
	}
}

Essa classe simplesmente desenha uma string em uma dada posição.

Agora, tenho uma outra classe chamada MemoriaUI:

public class MemoriaUI extends JPanel{
	
	private Conteudo[] memoria;
	
	public MemoriaUI(int tamanho){
		memoria = new Conteudo[tamanho];
		for(int i = 0; i < tamanho; i++){
			memoria[i] = new Conteudo();
			this.add(memoria[i]);
		}
		this.setBorder(BorderFactory.createLineBorder(Color.BLACK));
	}
	
	public void setConteudo(int posicao, String conteudo){
		memoria[posicao].setConteudo(conteudo);
	}
	
	public void paintComponent(Graphics g){
		//super.paint(g);
		for(int i = 0; i < memoria.length; i++){
			memoria[i].paint(g);
		}
	}
}

Essa classe deve manter uma lista de conteudos e repinta-los conforme um evento. Tenho 2 dúvidas:
1° - É correto adicionar cada um dos objetos conteudos ao meu objeto MemoriaUI?
2° - Ao fazer isso, o método paintComponent de MemoriaUI está correto?

Obrigado e peço que se puderem entrem em contato comigo através do email [email removido]. Agradeço a ajuda de tds.

davidbuzatto

Primeiro, use a chamada do método da superclasse para assegurar que a estrutura do painel será pintada de forma correta.

public void paintComponent(Graphics g){ super.paintComponent( g ); ... }

Já em MemoriaUI, não chame o método paint para repintar, e sim o método repaint().

memoria[i].repaint();

Em seu código vc está compartlhando o mesmo Graphics entre MemoriaUI e Conteudo (chamando paint), sendo assim vc só vai desenhar em quem tem aquele graphics. Isso NÃO deve ser feito, o paint é de responsabilidade do AWT… Não invoque ele nem paintComponente explicitamente. Use o repaint() como já falei.

A sua estruturação eu acho que está correta… Acho que isso vai mais de gosto mesmo.

Até mais!

renatoes

Caro davidbuzatto,

Muito obrigado pela resposta, testei aqui e tudo ocorreu normal :slight_smile:
Vou trabalhar aqui para montar o resto das classes, mas sua explicação iluminou muito.
Obrigado mais uma vez e boa noite a todos.

davidbuzatto

Que bom que deu certo!
Falow!

Criado 27 de julho de 2007
Ultima resposta 31 de jul. de 2007
Respostas 6
Participantes 3