JScrollPane em jpanel!

9 respostas
Alchemist

Pessoal já tentei de tudo !!!

PQ o meu JSCROLLPANE não funciona no meu JPAnel ?

package view;

import java.awt.Color;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.border.Border;

public class UsuarioView extends JFrame{

	private JTextField campAlunos;
	private JButton btIniciaAluno;
	private JPanel painelPrincipal;
	private JScrollPane painelNomeAlunoScroll;
	
	public UsuarioView(){
		super("Atendimento - Situação Acadêmica");
	
		setSize(800, 600);
		setResizable(false);
		setLayout(null);
		doGerarTelaUsuario();
		setLocationRelativeTo(null); 
		setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
	}
	
	private void doGerarTelaUsuario(){
		
		Border bordaPreta = BorderFactory.createLineBorder(Color.BLACK);
		Color colorCinzaClaro = Color.LIGHT_GRAY;
		Color colorBranco = Color.WHITE;
		
		painelPrincipal = new JPanel();
		painelPrincipal.setLayout(null);
		painelPrincipal.setBorder(bordaPreta);
		painelPrincipal.setBackground(colorBranco);
		painelPrincipal.setBounds(5, 5, 785, 565);
		
		JPanel painelNomeAluno = new JPanel();
		painelNomeAlunoScroll = new JScrollPane(painelNomeAluno);
		painelNomeAlunoScroll.setLayout(null);
		painelNomeAlunoScroll.setBorder(bordaPreta);
		painelNomeAlunoScroll.setBounds(10, 50, 700, 300);
		
		JLabel txtAluno = new JLabel("Aluno(s):");
		txtAluno.setBounds(10, 20, 100, 20);
		
		campAlunos = new JTextField();
		campAlunos.setBorder(bordaPreta);
		campAlunos.setBackground(colorCinzaClaro);
		campAlunos.setToolTipText("Insira os números de matrícula separados por virgula");
		campAlunos.setBounds(70, 20, 640, 20);
		
		Icon imgIconConfirm = new ImageIcon("src/view/image/iconConfirm.jpg");  
		btIniciaAluno = new JButton(imgIconConfirm);
		btIniciaAluno.setFocusable(false);
		btIniciaAluno.setToolTipText("Clique aqui encontrar o(s) Aluno(s)");
		btIniciaAluno.setBounds(740, 10, 35, 35);
		
		painelPrincipal.add(txtAluno);
		painelPrincipal.add(campAlunos);
		painelPrincipal.add(btIniciaAluno);
		add(painelPrincipal);
	}
	
	public void montaPainelNomeAluno(ArrayList<String> nomeAluno){
		Border bordaPreta = BorderFactory.createLineBorder(Color.BLACK);
		Color colorBranco = Color.WHITE;
		
		painelNomeAlunoScroll.removeAll();

		int espaco = 10;
		
		for (int i = 0; i < nomeAluno.size(); i++) {
			JTextField aluno = new JTextField();
			aluno.setBorder(bordaPreta);
			aluno.setBackground(colorBranco);
			aluno.setEditable(false);
			aluno.setText(nomeAluno.get(i));
			
			if(i==0)
				aluno.setBounds(10, espaco, 200,20 );
			else
				aluno.setBounds(10, espaco, 300,20 );
			
			painelNomeAlunoScroll.add(aluno);
			espaco += 30;
			
			
		}

		painelPrincipal.add(painelNomeAlunoScroll);
		painelPrincipal.updateUI();
	}
	
	
	public void setBtIniciaAlunoActionListener(ActionListener al){
		btIniciaAluno.addActionListener(al);
	}
	public JTextField getCampAlunos() {
		return campAlunos;
	}
	public void setCampAlunos(JTextField campAlunos) {
		this.campAlunos = campAlunos;
	}
	public JButton getBtIniciaAluno() {
		return btIniciaAluno;
	}
	public void setBtIniciaAluno(JButton btIniciaAluno) {
		this.btIniciaAluno = btIniciaAluno;
	}
	public JPanel getPainelPrincipal() {
		return painelPrincipal;
	}
	public void setPainelPrincipal(JPanel painelPrincipal) {
		this.painelPrincipal = painelPrincipal;
	}
	
	
}

já tentei de tudo até colocar setPreferrenceSize, já n sei mais o que fazer e eu precisava muito deste scroll :S

9 Respostas

Metaleiro

JScrollPane

Swing - JScrollPane rendering problem

Gerson_da_S_Lima

Cara eu rescrevi alguns trechos do teu código, dá uma olhada aí, tá funcionando o Scroll

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.border.Border;

public class UsuarioView extends JFrame{

	private JTextField campAlunos;
	private JButton btIniciaAluno;
	private JPanel painelPrincipal;
	private JScrollPane painelNomeAlunoScroll;
	
	public UsuarioView() {
		super("Atendimento - Situação Acadêmica");
	
		setSize(700, 450);
		setResizable(false);
		//setLayout(null);
		doGerarTelaUsuario();
		setLocationRelativeTo(null); 
		setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
	}
	
	private void doGerarTelaUsuario(){
		
		Border bordaPreta = BorderFactory.createLineBorder(Color.BLACK);
		Color colorCinzaClaro = Color.LIGHT_GRAY;
		Color colorBranco = Color.WHITE;
		
		painelPrincipal = new JPanel();
		//painelPrincipal.setLayout(null);
		painelPrincipal.setBorder(bordaPreta);
		painelPrincipal.setBackground(colorBranco);
		//painelPrincipal.setBounds(5, 5, 785, 565);		
		
		JLabel txtAluno = new JLabel("Aluno(s):");
		//txtAluno.setBounds(10, 20, 100, 20);
		
		campAlunos = new JTextField(60);
		campAlunos.setBorder(bordaPreta);
		campAlunos.setBackground(colorCinzaClaro);
		campAlunos.setToolTipText("Insira os números de matrícula separados por virgula");
		//campAlunos.setBounds(70, 20, 640, 20);
		
		Icon imgIconConfirm = new ImageIcon("src/view/image/iconConfirm.jpg");  
		btIniciaAluno = new JButton(imgIconConfirm);
		btIniciaAluno.setFocusable(false);
		btIniciaAluno.setToolTipText("Clique aqui encontrar o(s) Aluno(s)");
		//btIniciaAluno.setBounds(740, 10, 35, 35);
		
		painelPrincipal.add(txtAluno);
		painelPrincipal.add(campAlunos);
		painelPrincipal.add(btIniciaAluno);
		
		painelNomeAlunoScroll = new JScrollPane(painelPrincipal);
		//painelNomeAlunoScroll.setLayout(null);
		painelNomeAlunoScroll.setBorder(bordaPreta);
		//painelNomeAlunoScroll.setBounds(10, 50, 700, 300);
		
		getContentPane().add(painelNomeAlunoScroll, BorderLayout.CENTER);
		//add(painelPrincipal);
	}
	
	/*public void montaPainelNomeAluno(ArrayList<String> nomeAluno){
		Border bordaPreta = BorderFactory.createLineBorder(Color.BLACK);
		Color colorBranco = Color.WHITE;
		
		painelNomeAlunoScroll.removeAll();

		int espaco = 10;
		
		for (int i = 0; i < nomeAluno.size(); i++) {
			JTextField aluno = new JTextField();
			aluno.setBorder(bordaPreta);
			aluno.setBackground(colorBranco);
			aluno.setEditable(false);
			aluno.setText(nomeAluno.get(i));
			
			if(i==0)
				aluno.setBounds(10, espaco, 200,20 );
			else
				aluno.setBounds(10, espaco, 300,20 );
			
			painelNomeAlunoScroll.add(aluno);
			espaco += 30;
			
			
		}

		painelPrincipal.add(painelNomeAlunoScroll);
		painelPrincipal.updateUI();
	}*/
	
	
	public void setBtIniciaAlunoActionListener(ActionListener al){
		btIniciaAluno.addActionListener(al);
	}
	public JTextField getCampAlunos() {
		return campAlunos;
	}
	public void setCampAlunos(JTextField campAlunos) {
		this.campAlunos = campAlunos;
	}
	public JButton getBtIniciaAluno() {
		return btIniciaAluno;
	}
	public void setBtIniciaAluno(JButton btIniciaAluno) {
		this.btIniciaAluno = btIniciaAluno;
	}
	public JPanel getPainelPrincipal() {
		return painelPrincipal;
	}
	public void setPainelPrincipal(JPanel painelPrincipal) {
		this.painelPrincipal = painelPrincipal;
	}
	
	public static void main(String[] args) {
		new UsuarioView();
	}
	
}
Alchemist

Gerson da S. Lima Valeu a intenção mais com isto eu vou ter que usar um layout pronto e eu não queria isto… fora que vc apagou o painel que ficaria com o scrool XD mais blz rsrsrs

Metaleiro já tentei tudo isto ai e não consegui fazer funcionar :S ta osso a coisa !!

Alchemist

Eu consegui de um jeito que eu n queria

painelNomeAluno.setPreferredSize(new Dimension(50,1000));

só que assim ele deixa de ser dinamico… se utrapassar este 1000 de tamanho eu vou perder dado :S

será que alguem pode ajudar ?

Gerson_da_S_Lima

Tudo bem que você não queira usar um layout pronto, mas o problema é que você não adicionou o JScrollPanel em lugar nenhum, simplesmente adiciona um painel vazio, seta alguns atributos, mas não o coloca em lugar nenhum, por isso eu fiz algumas mudanças no seu código. Dá uma olhada melhor nele, repare que que o painel que você adiciona o scroll nao tem nada e você não coloca o Scroll em lugar algum.

Refiz parte do seu código, sem comentar muita coisa, só o layout que eu comentei mesmo.

import java.awt.Color;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.border.Border;

public class UsuarioView extends JFrame{

	private JTextField campAlunos;
	private JButton btIniciaAluno;
	private JPanel painelPrincipal;
	private JScrollPane painelNomeAlunoScroll;
	
	public UsuarioView(){
		super("Atendimento - Situação Acadêmica");
	
		setSize(800, 600);
		setResizable(false);
		setLayout(null);
		doGerarTelaUsuario();
		setLocationRelativeTo(null); 
		setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
	}
	
	private void doGerarTelaUsuario(){
		
		Border bordaPreta = BorderFactory.createLineBorder(Color.BLACK);
		Color colorCinzaClaro = Color.LIGHT_GRAY;
		Color colorBranco = Color.WHITE;
		
		painelPrincipal = new JPanel();
		//painelPrincipal.setLayout(null);
		painelPrincipal.setBorder(bordaPreta);
		painelPrincipal.setBackground(colorBranco);
		painelPrincipal.setBounds(5, 5, 785, 565);
		
		JLabel txtAluno = new JLabel("Aluno(s):");
		txtAluno.setBounds(10, 20, 100, 20);
		
		campAlunos = new JTextField(100);
		campAlunos.setBorder(bordaPreta);
		campAlunos.setBackground(colorCinzaClaro);
		campAlunos.setToolTipText("Insira os números de matrícula separados por virgula");
		campAlunos.setBounds(70, 20, 640, 20);
		
		Icon imgIconConfirm = new ImageIcon("src/view/image/iconConfirm.jpg");  
		btIniciaAluno = new JButton(imgIconConfirm);
		btIniciaAluno.setFocusable(false);
		btIniciaAluno.setToolTipText("Clique aqui encontrar o(s) Aluno(s)");
		btIniciaAluno.setBounds(740, 10, 35, 35);
		
		painelPrincipal.add(txtAluno);
		painelPrincipal.add(campAlunos);
		painelPrincipal.add(btIniciaAluno);
		
		JPanel painelNomeAluno = new JPanel();
		painelNomeAlunoScroll = new JScrollPane(painelPrincipal);
		//painelNomeAlunoScroll.setLayout(null);
		painelNomeAlunoScroll.setBorder(bordaPreta);
		painelNomeAlunoScroll.setBounds(10, 50, 700, 300);
		
		add(painelNomeAlunoScroll);
	}
	
	public void montaPainelNomeAluno(ArrayList<String> nomeAluno){
		Border bordaPreta = BorderFactory.createLineBorder(Color.BLACK);
		Color colorBranco = Color.WHITE;
		
		painelNomeAlunoScroll.removeAll();

		int espaco = 10;
		
		for (int i = 0; i < nomeAluno.size(); i++) {
			JTextField aluno = new JTextField();
			aluno.setBorder(bordaPreta);
			aluno.setBackground(colorBranco);
			aluno.setEditable(false);
			aluno.setText(nomeAluno.get(i));
			
			if(i==0)
				aluno.setBounds(10, espaco, 200,20 );
			else
				aluno.setBounds(10, espaco, 300,20 );
			
			painelNomeAlunoScroll.add(aluno);
			espaco += 30;
			
			
		}

		painelPrincipal.add(painelNomeAlunoScroll);
		painelPrincipal.updateUI();
	}
	
	
	public void setBtIniciaAlunoActionListener(ActionListener al){
		btIniciaAluno.addActionListener(al);
	}
	public JTextField getCampAlunos() {
		return campAlunos;
	}
	public void setCampAlunos(JTextField campAlunos) {
		this.campAlunos = campAlunos;
	}
	public JButton getBtIniciaAluno() {
		return btIniciaAluno;
	}
	public void setBtIniciaAluno(JButton btIniciaAluno) {
		this.btIniciaAluno = btIniciaAluno;
	}
	public JPanel getPainelPrincipal() {
		return painelPrincipal;
	}
	public void setPainelPrincipal(JPanel painelPrincipal) {
		this.painelPrincipal = painelPrincipal;
	}
	
	public static void main(String[] args) {
		new UsuarioView();
	}
}
Alchemist

¬¬ mano ve o codigo direito…

#  JPanel painelNomeAluno = new JPanel();  
#         painelNomeAlunoScroll = new JScrollPane(painelNomeAluno);  
#         painelNomeAlunoScroll.setLayout(null);  
#         painelNomeAlunoScroll.setBorder(bordaPreta);  
#         painelNomeAlunoScroll.setBounds(10, 50, 700, 300);

é claro que não tem nada o metodo

# public void montaPainelNomeAluno(ArrayList<String> nomeAluno){  
#         Border bordaPreta = BorderFactory.createLineBorder(Color.BLACK);  
#         Color colorBranco = Color.WHITE;  
#           
#         painelNomeAlunoScroll.removeAll();  
#   
#         int espaco = 10;  
#           
#         for (int i = 0; i < nomeAluno.size(); i++) {  
#             JTextField aluno = new JTextField();  
#             aluno.setBorder(bordaPreta);  
#             aluno.setBackground(colorBranco);  
#             aluno.setEditable(false);  
#             aluno.setText(nomeAluno.get(i));  
#               
#             if(i==0)  
#                 aluno.setBounds(10, espaco, 200,20 );  
#             else  
#                 aluno.setBounds(10, espaco, 300,20 );  
#               
#             painelNomeAlunoScroll.add(aluno);  
#             espaco += 30;  
#               
#               
#         }  
#   
#         painelPrincipal.add(painelNomeAlunoScroll);  
#         painelPrincipal.updateUI();  
#     }

coloca os componentes

Alchemist

Bom classe com o scroll não dinamico ficou assim !!!

Se alguem realmente poder me ajudar eu vou ficar muito feliz mesmo !!

package view;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.border.Border;

public class UsuarioView extends JFrame{

	private JTextField campAlunos;
	private JButton btIniciaAluno;
	private JPanel painelPrincipal;
	private JScrollPane painelNomeAlunoScroll;
	JPanel painelNomeAluno;
	
	public UsuarioView(){
		super("Atendimento - Situação Acadêmica");
		setSize(800, 600);
		setResizable(false);
		setLayout(null);
		doGerarTelaUsuario();
		setLocationRelativeTo(null); 
		setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
	}
	
	private void doGerarTelaUsuario(){
		
		Border bordaPreta = BorderFactory.createLineBorder(Color.BLACK);
		Color colorCinzaClaro = Color.LIGHT_GRAY;
		Color colorBranco = Color.WHITE;
		
		painelPrincipal = new JPanel();
		painelPrincipal.setLayout(null);
		painelPrincipal.setBorder(bordaPreta);
		painelPrincipal.setBackground(colorBranco);
		painelPrincipal.setBounds(5, 5, 785, 565);
		
		painelNomeAluno = new JPanel();
		painelNomeAluno.setLayout(null);
		painelNomeAluno.setPreferredSize(new Dimension(50,1000));
		
		JLabel txtAluno = new JLabel("Aluno(s):");
		txtAluno.setBounds(10, 20, 100, 20);
		
		campAlunos = new JTextField();
		campAlunos.setBorder(bordaPreta);
		campAlunos.setBackground(colorCinzaClaro);
		campAlunos.setToolTipText("Insira os números de matrícula separados por virgula");
		campAlunos.setBounds(70, 20, 640, 20);
		
		Icon imgIconConfirm = new ImageIcon("src/view/image/iconConfirm.jpg");  
		btIniciaAluno = new JButton(imgIconConfirm);
		btIniciaAluno.setFocusable(false);
		btIniciaAluno.setToolTipText("Clique aqui encontrar o(s) Aluno(s)");
		btIniciaAluno.setBounds(740, 10, 35, 35);
		
		painelPrincipal.add(txtAluno);
		painelPrincipal.add(campAlunos);
		painelPrincipal.add(btIniciaAluno);
		add(painelPrincipal);
	}
	
	public void montaPainelNomeAluno(ArrayList<String> nomeAluno){
		Border bordaPreta = BorderFactory.createLineBorder(Color.BLACK);
		Color colorBranco = Color.WHITE;
		int espaco = 10;
		
		painelNomeAluno.removeAll();
		
		for (int i = 0; i < nomeAluno.size(); i++) {
			JTextField aluno = new JTextField();
			aluno.setBorder(bordaPreta);
			aluno.setBackground(colorBranco);
			aluno.setEditable(false);
			aluno.setText(nomeAluno.get(i));
			
			aluno.setBounds(10, espaco, 300,20 );
			
			painelNomeAluno.add(aluno);
			espaco += 30;
		}
		painelNomeAlunoScroll = new JScrollPane(painelNomeAluno);
		painelNomeAlunoScroll.setBounds(10, 50, 400, 300);
		painelNomeAlunoScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		painelPrincipal.add(painelNomeAlunoScroll);
		painelPrincipal.updateUI();
	}
	
	
	public void setBtIniciaAlunoActionListener(ActionListener al){
		btIniciaAluno.addActionListener(al);
	}
	public JTextField getCampAlunos() {
		return campAlunos;
	}
	public void setCampAlunos(JTextField campAlunos) {
		this.campAlunos = campAlunos;
	}
	public JButton getBtIniciaAluno() {
		return btIniciaAluno;
	}
	public void setBtIniciaAluno(JButton btIniciaAluno) {
		this.btIniciaAluno = btIniciaAluno;
	}
	public JPanel getPainelPrincipal() {
		return painelPrincipal;
	}
	public void setPainelPrincipal(JPanel painelPrincipal) {
		this.painelPrincipal = painelPrincipal;
	}
	
	
}
CrOnNoS
Well, no seu caso com os layout's null creio que você vai precisar controlar o preferridsize dinamicamente no método de montar o painel. Uma opção seria contar quantos componentes serão inseridos no painel e multiplicar essa quantia pela "height" de cada Por exemplo:
...
		painelNomeAluno.removeAll();
		int contadorDeComponentes = 0;

		for (int i = 0; i < nomeAluno.size(); i++) {
			contadorDeComponentes++;
			...
		}
...
		painelPrincipal.add(painelNomeAlunoScroll);
		// 30 de height afinal você setou as Bounds dos componentes para começar a 10 de distância do topo e ter 20 de altura.
		// adicionei o +10 para colocar esses de 10 distância da borda em baixo também.
		painelNomeAluno.setPreferredSize(new Dimension(50,
				30 * contadorDeComponentes));
		painelPrincipal.updateUI();
}

EDIT: Esqueci de conclui ... o caso é que o scrollpane se configura de acordo com o preferredsize do component que foi inserido nele. Como o seu componente estava com layout(null) o preferredSize dele era constante o que você havia configurado.
Quando eu usava o null eu fazia dessa forma que te mostrei no exemplo ... talvez tenha outra mas, recomendo muito mais aprender a usar o GridBagLayout .. chamam ele de "mais complexo" mas não é tão complexo assim e, é infinitamente mais simples de usar que o próprio null quando usado em conjunto com a classe Box.

Alchemist

Valeu CrOnNoS :P, eu estava dando umas olhadas em uns projetos antigos meu e eu usava o setPreferredSize calculando o tamanhodo JFrame, vou fazer os calculos dos componentes mesmo :stuck_out_tongue:

Valeu ai todo mundo que ajudou :stuck_out_tongue:

Criado 19 de novembro de 2009
Ultima resposta 21 de nov. de 2009
Respostas 9
Participantes 4