JScrollPane "duplicando" JPanel e outros mais problemas

Tenho a seguinte situação:
Criei uma classe que estende JPanel e sobrescrevi seu método paint.
Como tal panel pode ter um tamanho demasiado grande, optei por adicioná-lo em um JScrollPane.
Com isso, obtive os seguintes problemas:

1- Quando executo o programa, o JPanel não aparece enquanto eu não forçar um repaint no mesmo (o mesmo ocorre quando redimensiono a janela).
Programa executado
Após 1 clique (que força o repaint)
Janela maximizada (novamente o JPanel parece sumir)

2- A barra de scroll apenas se move se eu clicar na mesma e arrasta-la (usando scroll do mouse ou as setas da barra realizam scroll, porem a barrinha não se desloca)

3- Quando chego no limite do JPanel, surge uma duplicata do mesmo, que não tem nenhum listener (como se fosse apenas uma imagem colada ali)

Duplicata mencionada (notem também como o scroll não se moveu e continua lá em cima)
Após arrastar a scrollbar (surgiu um pedaço de scrollbar no canto superior esquerdo e, apenas de a imagem aparentar ser a mesma que a anterior, nenhum listener do panel é ativado pois o que aparece é apenas uma “cópia” ou algo assim do original)

A seguir, o código da frame principal:

[code]package com.jam.mapcreator;

import java.awt.Dimension;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JScrollPane;

public class PrimaryWindow extends JFrame {
private JScrollPane scrollPane;
private MapPanel mapPanel;

public PrimaryWindow(){
	Dimension screen = this.getToolkit().getScreenSize();
	this.setBounds((int) (screen.getWidth()/4), (int) (screen.getHeight()/4), (int)screen.getWidth()/2, (int) screen.getHeight()/2);
	this.setDefaultCloseOperation(EXIT_ON_CLOSE);
	this.setTitle("Map Maker v.0.1");
	
	mapPanel = new MapPanel(100, 100);
	mapPanel.setPreferredSize(this.getMaximumSize());
	
	scrollPane = new JScrollPane();
	scrollPane.getVerticalScrollBar().setUnitIncrement(25);
	scrollPane.getHorizontalScrollBar().setUnitIncrement(25);
	
	scrollPane.setViewportBorder(BorderFactory.createBevelBorder(0));
	scrollPane.setViewportView(mapPanel);
	scrollPane.getViewport().setOpaque(false);
	this.add(scrollPane);
	this.setVisible(true);
}	

}
[/code]

Espero que possam me ajudar.

Amigo, quando você fala que reescreveu o método paint, está falando do do método paintComponent(), não é? Pois reescrever o método paint é inútil na maiorira das vezes, tem que ser o paintComponent.

Em segundo lugar, já que você está herdadando Jframe, é bom chamar o método super() logo na primeira linha, pra garantir que a classe pai possa fazer seus procedimentos corretamente. Se nada resolver, posta o código da outra classe aí. Até.

Agradeço a resposta, e já consegui solucionar meu problema.

Aparentemente quando mandava setar o preferred size do meu panel com getMaximumSize() do meu frame, ele passava um tamanho absurdo,
por isso o tamanho minusculo das barras de rolagem e a aparente inercia das mesmas.

Mas ainda não sei por que isso causava a “duplicação” do panel (se eu forçava um repaint de tempos em tempos, essa copia sumia).

Mas observe o que o colega falou. O método correto para sobrescrever é o paintComponent e não o método paint.
Mais informações: http://java.sun.com/products/jfc/tsc/articles/painting/#callbacks

Nossa, não tinha ideia disso. (na realidade, nunca tinha reparado que haviam outros métodos paint)

Mas estou curioso agora com relação a afirmação feita: " reescrever o método paint é inútil na maiorira das vezes"

Como assim inútil?

Nunca mexi de forma avançada com gráficos e afins, mas sempre que o fiz, sobrescrevi o método paint em si, sob orientação de meus professores, e nunca me falhou.

De acordo com o link passado pelo ViniGodoy, pude ver que não é aconselhável sobrescrever o método paint em si, mas pelo que entendi o resultado visual seria o mesmo, não?

[quote]Nossa, não tinha ideia disso. (na realidade, nunca tinha reparado que haviam outros métodos paint)

Mas estou curioso agora com relação a afirmação feita: " reescrever o método paint é inútil na maiorira das vezes"

Como assim inútil?

Nunca mexi de forma avançada com gráficos e afins, mas sempre que o fiz, sobrescrevi o método paint em si, sob orientação de meus professores, e nunca me falhou.

De acordo com o link passado pelo ViniGodoy, pude ver que não é aconselhável sobrescrever o método paint em si, mas pelo que entendi o resultado visual seria o mesmo, não? [/quote]
Basicamente…sim. ^^

Não.
O método paint chama os três métodos: paintBorder, paintChildren e paintComponent.
Se você sobrescreve-lo, seu componente não desenhará nem mais bordas, nem os componentes que estão sobre ele.

Na verdade, é um pouco mais complexo que isso, pois o paint também faz algumas verificações antes disso, e também lida com componentes AWT.

Você só deve sobrescrever o método paint no caso de janelas (JFrame, JDialog e JApplet).
Note que o artigo é bastante enfático sobre não sobrescrever o método paint de JComponents.
Essa afirmação é repetida diversas vezes.

[quote=ViniGodoy]Não.
O método paint chama os três métodos: paintBorder, paintChildren e paintComponent.
Se você sobrescreve-lo, seu componente não desenhará nem mais bordas, nem os componentes que estão sobre ele.

Na verdade, é um pouco mais complexo que isso, pois o paint também faz algumas verificações antes disso.

Você só deve sobrescrever o método paint no caso de janelas (JFrame, JDialog e JApplet).

[/quote]

Ah, entendo - até agora tinha utilizado-o apenas em janelas mesmo.

Agradeço as dicas.

Sim, nas no caso você tinha usado num JPanel, não? Aí é paintComponent mesmo. :slight_smile:

Esse mapMaker que vc está tentando fazer é estilo um editor baseado em tiles? Um dos meus jogos, chamado Caça à bandeira, tinha um editor nesse estilo.

[quote=ViniGodoy]Sim, nas no caso você tinha usado num JPanel, não? Aí é paintComponent mesmo. :slight_smile:

Esse mapMaker que vc está tentando fazer é estilo um editor baseado em tiles? Um dos meus jogos, chamado Caça à bandeira, tinha um editor nesse estilo.[/quote]

É dessa vez é um JPanel, e sim, um editor baseado em tiles para facilitar a criação de um mapa para meu jogo

darei uma olhada no sei projeto :slight_smile:

Pode ser mais proveitoso e mais produtivo você escrever apenas um programa que lê o formato de um editor de tiles já desenvolvido, como o Mappy ou o TileMap Editor.
Seria muito interessante que você lesse os tutoriais de Java do Ponto V:
http://www.pontov.com.br/site/java

Agora, se você não for obrigado a usar Java, considere fortemente a possibilidade de fazer seu jogo em C# com XNA. O Java é uma linguagem bem inadequada para jogos desktop.

[quote=ViniGodoy]Pode ser mais proveitoso e mais produtivo você escrever apenas um programa que lê o formato de um editor de tiles já desenvolvido, como o Mappy ou o TileMap Editor.
Seria muito interessante que você lesse os tutoriais de Java do Ponto V:
http://www.pontov.com.br/site/java

Agora, se você não for obrigado a usar Java, considere fortemente a possibilidade de fazer seu jogo em C# com XNA. O Java é uma linguagem bem inadequada para jogos desktop.
[/quote]

Já está pronto esse mapmaker, então acho mais facil assim porque eu sei como foi feito tudo e já sei como ler o arquivo gerado xP

sobre o jogo, é obrigatorio ser em java e tambem ja tenho grande parte pronta, mas achei bem interessante as comparações feitas no link passado.

tambem tenho uma aula voltada ao C# mas o problema é o costume - comecei a ver Java ano passado e C# apenas esse ano - então mesmo que pudesse optar, continuaria com java (pelo menos pra esse projeto :smiley: )

Ok. Então dê uma olhada nos artigos lá, pois eles tem as recomendações de boas práticas.
Além disso, ensinam você a não jogar performance fora ou ter flickering, através de técnicas como a escrita direta.