[RESOLVIDO] ScrollPane com Graphics

8 respostas
TalonNoxus

Bom dia galera, tudo bem? Estou conseguindo gerar uma matriz de Graphics e usando o drawRect para desenhar o retângulo, e ai quando eu crio uma matriz muito grande, os retângulos passam da tela(como já era o esperado), só que ai eu fui tentar usar o JScrollPane só que não adiantou, a barra de rolagem não aparece quando eu desenho, apenas se eu escrevo algo. Obs: Ja tentei usar JPanel ao invés do JTextArea

Não é o problema principal mas, o que eu posso por no setSize() para ficar em tela cheia? Pois ficar colocando números grandes não é o certo...

O que eu posso fazer?

Abaixo segue o codigo
Não é o poblema principal mas, o que eu posso por no setSize() para ficar em tela cheia? Pois ficar colocando numeros grandes não é o certo...

public class Aplicacao extends JFrame
{
	public static void main(String[] args)
	{
		new Aplicacao();
	}
	public Aplicacao()
	{
		
		Matriz matriz = new Matriz(180, 120);
		JTextArea area = new JTextArea();
		area.add(matriz);
		JScrollPane scroll = new JScrollPane(area);
		
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(640, 480);
		setVisible(true);
		add(scroll);
	}
}
public class Matriz extends JComponent
{
	int linha, coluna;
		
	Graphics2D[][] g2;
	Matriz(int linha, int coluna)
	{
		setSize(5000, 5000);
		this.linha = linha;
		this.coluna = coluna;
		
	}
		
	@Override
	protected void paintComponent(Graphics g)
	{
		super.paintComponents(g);
		g2 = new Graphics2D[linha][coluna];
		
		int largura = 15, altura= 30;
		
		for(int i = 0; i < linha; i++)
		{
			for(int j = 0; j < coluna; j++)
			{
				g2[i][j] = (Graphics2D)g;
				g2[i][j].drawRect(j+(j*(largura+1)+8), i+(i*(altura+1)+20), largura, altura);
			}
		}
	}
}

8 Respostas

D

Olá

Está estranho o que vc está fazendo

Seria isso?:

public Aplicacao() {
    JTextArea area = new JTextArea();
    Matriz matriz = new Matriz(180, 120);
    
    area.addComponentListener(new ComponentAdapter() {
        @Override
        public void componentResized(ComponentEvent e) {
            matriz.setSize(area.getSize());
        }
    });

    area.add(matriz);
    JScrollPane scroll = new JScrollPane(area);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(640, 480);
    setVisible(true);
    add(scroll);
}

public class Matriz extends JComponent {

    int linha, coluna;

    Matriz(int linha, int coluna) {
        this.linha = linha;
        this.coluna = coluna;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponents(g);
        int largura = 15, altura = 30;
        for (int i = 0; i < linha; i++) {
            for (int j = 0; j < coluna; j++) {
                g.drawRect(j + (j * (largura + 1) + 8), i + (i * (altura + 1) + 20), largura, altura);
            }
        }
    }
}
TalonNoxus

Ainda não é isso, a barra de rolagem não aparece, nem a vertical e nem a horizontal

D

Então seria:

JScrollPane scroll = new JScrollPane(area,
        JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
        JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
TalonNoxus

Agora a barra de rolagem aparece, porém não da para rolar ela :confused:

D

Adicione:

area.setPreferredSize(new Dimension(5000, 5000));
TalonNoxus

Muito obrigado diego12, deu certo aqui :slight_smile: me ajudou muito

Agora só para mim ter mais informações dos métodos que vc me passou…
Qual a diferença de setPreferredSize() e setSize()?
No construtor por que passar o Dimension, ao invés de apenas os valores?

obs:Eu li na internet mas fiquei meio confuso haha, eu estudo Swing a 1 semana e meia

D

O setPreferredSize é o tamanho de preferencia do component e geralmente é o próprio component q decide o tamanho, o setSize é o tamanho atual do component e é geralmente decidido pelo LayoutManager.

Vc já deve ter percebido q o tamanho dos components (de qualquer aplicaçao) não possuem tamanhos definidos, pois eles crescem ou diminuem conforme a necessidade, isso seria como a manipulação de um LayoutManager usando o setSize nos components para se adaptarem ao espaço disponível, o preferredSize vai avisar ao LayoutManager q o component possui um tamanho preferencial e vai evitar do component cresça ou diminua afim de manter o tamanho preferencial.

O LayoutManager é responsável por administrar o tamanho e a posição dos components.


Acho q os components não possuem o método setPreferredSize(int width, int height), só o setPreferredSize(Dimension d) mesmo, faz um teste e verifique se existe:

area.setPreferredSize(5000, 5000);
TalonNoxus

Muito obrigado de novo diego12 :thumbsup:

Criado 13 de maio de 2016
Ultima resposta 14 de mai. de 2016
Respostas 8
Participantes 2