[Resolvido]JPanel em branco

2 respostas
E

Fala galera, então, to desenvolvendo o meu programa e tal, mas uma coisa que eu ainda não sonsegui fazer foi deixar o Jpanel( a área de desenho do programa) branco. Eu não sei no windows, mas aqui no linux mint ele acaba pegando a cor do tema, ficando meio acizentado. Pra vocês terem uma idéia, olha como é que fica quando eu passo a ferramenta borracha no painel:

[URL=http://www.imagebanana.com/view/6c87k5kv/NovaImagem0UniversoPessoalVerso0.3al.png][/URL]

Conseguem ver um branco rabiscado na área de desenho? Já tentei usar Setbackground, mas foi o mesmo que nada. Alguém tem outra sugestão? segue o código:

/**
	 * Armazena o objeto que representa a area desenho
	 */
	private JPanel jpArea = new JPanel() {
		/**
		 * Armazena o objeto responsável pelo desenho no programa principal
		 */
		private Desenhista operador = dsDesenhista;

		@Override
		protected void paintComponent(Graphics g) {
			g = g.create();
			super.paintComponents(g);
			operador.paintComponent(g);
			g.dispose();

		}

	};
//(...) Outras alterações na área de desenho no método abaixo:

	/**
	 * Executa as operações de configuração da área de desenho
	 */
	public void configuraAmbiente() {
		this.dsDesenhista.setPainel(jpArea);

		this.jpBarras.setLayout(new BorderLayout());
		this.criaBarraBasica();
		this.jfJanela.add(this.jpBarras);

		this.jpArea.setMaximumSize(dmTamanho);
		this.jpArea.setPreferredSize(dmTamanho);
		this.jpArea.setOpaque(true);
		this.jpArea.setBackground(Color.white);
		this.jpArea.addMouseListener(this.dsDesenhista);
		this.jpArea.addMouseMotionListener(this.dsDesenhista);
		this.jpArea.addMouseWheelListener(this.dsDesenhista);
		this.jpArea.setBorder(BorderFactory.createLineBorder(Color.black));

		this.jpBarras.setMaximumSize(new Dimension(Integer.MAX_VALUE, 30));

		JPanel mesa = new JPanel();
		mesa.setLayout(new BoxLayout(mesa, BoxLayout.X_AXIS));
		mesa.add(Box.createHorizontalGlue());
		mesa.add(this.jpArea);
		mesa.add(Box.createHorizontalGlue());
		mesa.setBackground(Color.gray);
		mesa.setPreferredSize(dmTamanho);

		this.jspBase.setViewportView(mesa);
		this.jspBase.getViewport();
		this.jpArea.addPropertyChangeListener( new PropertyChangeListener() {
			@Override
			public void propertyChange(PropertyChangeEvent evt) {
				// TODO Auto-generated method stub
					
			}
		});
		
		this.jfJanela.add(this.jspBase);
	}

Segue aos métodos da classe desenhista:

/**
	 * Desenha todos os compenentes presentes na lista de desenho no objeto Graphics indicado
	 * @param g o contexto gráfico usado para o desenho
	 */
	protected void paintComponent(Graphics g) {
		// TODO Auto-generated method stub
		verificaImagem();
		g.drawImage(this.imVisualizacao, 0, 0, this.getPainel().getWidth(), this.getPainel().getHeight(), null);
		desenhaRestantes(g);
		
	}

	/**  Verifica se a imagem é compatível com o conteúdo das listas de desenhos e a modifica, caso não seja
	 */
	private void verificaImagem() {
		if(this.imVisualizacao==null || (this.imVisualizacao.getWidth(null) != this.imagemAtual.getTamanho().getWidth() ||this.imVisualizacao.getHeight(null) != this.imagemAtual.getTamanho().getHeight())){
			this.imVisualizacao = this.painel.createImage((int)this.imagemAtual.getTamanho().getWidth(), (int) this.imagemAtual.getTamanho().getHeight()); 
			if(!this.lsDesenhosImpressos.isEmpty()){
				this.imprimeLista(this.lsDesenhosImpressos);
			}
		}
	}

	/**
	 * Imprime os desenhos que ainda estão na lista dos pendentes
	 * @param grafico o contexto gráfico onde serão impressos 
	 */
	void desenhaRestantes(Graphics grafico) {
		//Se já tá tudo desenhado, retorna
		if(this.lsDesenhosPendentes.isEmpty())
			return;
		
		desenhaLista(this.lsDesenhosPendentes, grafico,this.imagemAtual.getZoom());
	}

/**Desenha a lista indicada no contexto gráfico indicado utilizando o fator de zoom para posicionamento dos objetos
	 * @param lista a lista de objetos Desenho a ser impressa no contexto
	 * @param grafico o contexto gráfico aonde serão impressos os desenhos
	 * @param zoom o fator de zoom a ser aplicado quando do desenho na imagem
	 */
	private void desenhaLista(List<Desenho> lista, Graphics grafico, double zoom) {
		((Graphics2D)grafico).scale(zoom, zoom);
		
		for(Desenho desenho : lista){
			grafico.setColor(desenho.getCor());
			((Graphics2D)grafico).setStroke(new BasicStroke(desenho.getEspessuraLinha(), BasicStroke.CAP_ROUND ,BasicStroke.JOIN_MITER));
			int origemX, origemY;
			origemX = Math.min(desenho.getOrigemX(), desenho.getFimX());
			origemY = Math.min(desenho.getOrigemY(), desenho.getFimY());
			
			if(desenho.estaPronto())
				switch(desenho.getTipo()){
				case RETA:
					grafico.drawLine(desenho.getOrigemX(), desenho.getOrigemY(), desenho.getFimX(), desenho.getFimY());
					break;
				case RETANGULO:
					if(desenho.estaPreenchida())
						grafico.fillRect( (desenho.eCentrado()? desenho.getOrigemX() - desenho.getLargura(): origemX),   (desenho.eCentrado()? desenho.getOrigemY() - desenho.getAltura(): origemY), desenho.getLargura()*(desenho.eCentrado()? 2: 1), desenho.getAltura()*(desenho.eCentrado()? 2: 1));
					if(desenho.getEspessuraLinha() > 0){
						grafico.setColor(((Retangulo)desenho).getCorBorda());
						grafico.drawRect( (desenho.eCentrado()? desenho.getOrigemX() - desenho.getLargura(): origemX),   (desenho.eCentrado()? desenho.getOrigemY() - desenho.getAltura(): origemY), desenho.getLargura()*(desenho.eCentrado()? 2: 1), desenho.getAltura()*(desenho.eCentrado()? 2: 1));
					}
					break;
				case CIRCULO:
					if(desenho.estaPreenchida())
						grafico.fillOval( (desenho.eCentrado()? desenho.getOrigemX() -desenho.getLargura(): origemX),  (desenho.eCentrado()? desenho.getOrigemY() -desenho.getAltura(): origemY), desenho.getLargura()*(desenho.eCentrado()? 2: 1), desenho.getAltura()*(desenho.eCentrado()? 2: 1));
					if(desenho.getEspessuraLinha() > 0){
						grafico.setColor(((Elipse)desenho).getCorBorda());
						grafico.drawOval( (desenho.eCentrado()? desenho.getOrigemX() - desenho.getLargura(): origemX),   (desenho.eCentrado()? desenho.getOrigemY() - desenho.getAltura(): origemY), desenho.getLargura()*(desenho.eCentrado()? 2: 1), desenho.getAltura()*(desenho.eCentrado()? 2: 1));
					}
					break;
				case LINHA:
						((Graphics2D)grafico).draw(((Linha)desenho).geraLinha());
						break;
				case POLIGONO:
					for (Line2D linhaPreenchimento : (((Poligono)desenho).getLinhas())) {
						((Graphics2D)grafico).draw(linhaPreenchimento);
					}
					break;
				case IMAGEM:
					grafico.drawImage(((Imagem) desenho).getImagem(), origemX, origemY, null);
				}

		}
	}

2 Respostas

Marky.Vasconcelos

Primeiro, chame o super.paintComponent antes do g.create(), se algum componente modificar o estado do Graphics voce vai ter efeitos estranhos.

Normalmente eu pinto o fundo (fillRect) na cor que eu quero, e nesse caso voce pode até dar a opção para mudar a cor de fundo no seu programa.

E

É verdade, meu erro é que eu tinha tentando antes usando clearRect(), mas olhando a documentação do método, eu vi:

então o código ficou assim:

/**  Verifica se a imagem é compatível com o conteúdo das listas de desenhos e a modifica, caso não seja
	 */
	private void verificaImagem() {
		if(this.imVisualizacao==null || (this.imVisualizacao.getWidth(null) != this.imagemAtual.getTamanho().getWidth() ||this.imVisualizacao.getHeight(null) != this.imagemAtual.getTamanho().getHeight())){
			this.imVisualizacao = this.painel.createImage((int)this.imagemAtual.getTamanho().getWidth(), (int) this.imagemAtual.getTamanho().getHeight());
			
			if(!this.lsDesenhosImpressos.isEmpty()){
				this.imprimeLista(this.lsDesenhosImpressos);
			}else{
				Graphics g = this.imVisualizacao.getGraphics(); 
				g.setColor(Color.white);
				g.fillRect(0, 0, this.imVisualizacao.getWidth(null), this.imVisualizacao.getWidth(null));	
			}
		}
	}

Agora, será que dá pra me dar um help nesse outro tópico aqui também? Desde já, valeu.

Criado 29 de julho de 2011
Ultima resposta 1 de ago. de 2011
Respostas 2
Participantes 2