[Resolvido]Adicionar ScrollPane a um JPanel

32 respostas
G

Eaí GUJZeiros, beleza?

Estou com uma dúvida que está me matando! Não estou conseguindo adicionar um scrollpane ao meu ThumbNail!!

Segue o código:

public class ThumbNail extends JPanel {

/*Este é o código que eu uso para criar os jpanels que irão compôr meu thumb*/
private void ajustaImagensThumbNail(){
        
        JLabel img;
        JLabel nomeImg;
        JPanel p;
        BorderLayout pnlLay;
        int k = 0;
        
        for (BufferedImage i : listaBfi) {
            /*Cria o Painel que estará a imagem*/
            pnlLay = new BorderLayout(0, 0);
            p = new JPanel(pnlLay);
            configuraMouseListener(p);
            
            /*Configura as Labels que serão adicionadas no painel*/
            img = new JLabel(new ImageIcon(i));  
            nomeImg = new JLabel(listaArqImagens.get(k).getName());
            
            /*Posiciona corretamente dentro do painel*/
            p.add(img,pnlLay.CENTER);
            p.add(nomeImg,pnlLay.SOUTH);
            
            add(p);
            k++;           
        }
    }
 
    private void configInicial() {
        GridLayout testeLay = new GridLayout(0, 2);
        testeLay.setVgap(20);
        setLayout(testeLay);
        
        JScrollPane pane = new JScrollPane(this);
        setBorder(BorderFactory.createEtchedBorder());
        setSize(400, 600);
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
       setLocation(screenSize.width-getWidth(), (screenSize.height-getHeight()+5)/2);        
    }
/*Este é o método que chamará meu thumb de outra classe*/

private void exibeGUI(){
        JFrame tmp = new JFrame();
        tmp.setSize(1024,768);
        ThumbNail thumb = new ThumbNail(listaImagens,parametros[2], 120, 100,control);
        tmp.add(thumb,BorderLayout.EAST);
        
        tmp.setLocationRelativeTo(null);
        
        tmp.setVisible(true);
    }

Obrigado!!

32 Respostas

L

Tenta adicionar essa linha:

p.add( pane() );

Debaixo da criação do JScrollPane no metodo da outra classe.

G

Tipo, no meu caso, a própria classe adicionaria o pane, mas não daria problema não?

Tipo

add(pane);
já que usei o objeto thumb para criar o scrollpane.

Enfim, o que fiz anteriormente foi algo parecido: eu criei um objeto panel, o qual eu construía o thumb em cima dele, ao final eu criava o scrollpane e fazia isso que tu tá dizendo, e só depois eu dava o

add(thumb);

msm assim, não funcionou…

L

Se tiver como posta o codigo todo, das duas classes aqui, se tiver como não ser tudo ta tranquilo, mas tenta pelo menos postar só o essencial para eu compilar e analisar aqui. Se eu demorar a responder é porque estou ocupado no momento. Flw?

G

Para este código funcionar, basta criar uma classe que estenda jpanel e fazer pequenas adptações, não mando o código porque estou no trabalho agora…

Mas, se tu criar uma List de objetos Image, ele vai pegar.

Chegar em ksa eu mando!

L

Veja se este código ajuda em algo a você:

// Figura 14.21: ComboBoxFrame.java
// JComboBox que exibi uma lista de nomes de imagens
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JComboBox;
import javax.swing.Icon;
import javax.swing.ImageIcon;

public class ComboBoxFrame extends JFrame
{
	private JComboBox imagensCombo; // caixa de combinação para armazenar nomes de ícones
	private JLabel label; // rótulo para exibir ícone selecionado
	
	private static final String[] nomes =
		{ "bug1.gif", "bug2.gif", "travelbug.gif", "buganim.gif" };
	private Icon[] icones = {
		new ImageIcon( getClass().getResource(nomes[0]) ),
		new ImageIcon( getClass().getResource(nomes[1]) ),
		new ImageIcon( getClass().getResource(nomes[2]) ),
		new ImageIcon( getClass().getResource(nomes[3]) ) };
		
	// Construtor ComboBoxFrame adiciona JComboBox ao JFrame
	public ComboBoxFrame()
	{
		super( "Testando JComboBox" );
		setLayout( new FlowLayout() );
		
		imagensCombo = new JComboBox( nomes ); // configura JComboBox
		imagensCombo.setMaximumRowCount( 3 ); // exibe 3 linhas
		
		imagensCombo.addItemListener(
			new ItemListener() // classe interna anônima
			{
				// trata evento JComboBox
				public void itemStateChanged( ItemEvent evento )
				{
					// determina se o item selecionado
					if( evento.getStateChange() == ItemEvent.SELECTED )
						label.setIcon( icones[ imagensCombo.getSelectedIndex() ] );
				}
			}
		); // fim da chamada para addItemListener
		
		add( imagensCombo ); // adiciona combobox ao JFrame
		label = new JLabel( icones[0] );
		add( label );
	}
}
// Figura 14.22: ComboBoxTeste.java
// Testando ComboBoxFrame.
import javax.swing.JFrame;

public class ComboBoxTeste
{
	public static void main( String[] args )
	{
		ComboBoxFrame comboBF = new ComboBoxFrame();
		comboBF.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		comboBF.setSize( 350, 150 );
		comboBF.setVisible( true );
	}
}
G

tô ligado combobox, mas não é minha solução não… valeu mesmo assim!

É só por que as vezes tem muitas imagens para mostrar no thumb, e não queria redimensioná-las, mantendo assim um tamanho fixo; e para mostrar todas preciso de um scroll!

L

O que seria mostrar no seu Thumb? voce quer colocar o scroll no panel, jframe, onde?

G

Eu tenho:

1 - Frame (Interpretador)
2 - ThumbNail (Painel de imagens alinhadas 2 a 2 com indefinidas fileiras de imagens, que sao lidas e agrupadas num List e posteriormente passadas como parâmetro).

Então, por serem indefinidas, podem não caber na tela, e para isso preciso do scroll…

Por fim, depois de o thumbnail está criado e configurado, ele será adicionado ao Interpretador.

L

Remova essa linha

JScrollPane pane = new JScrollPane(this);

E tente

private void ajustaImagensThumbNail(){
//...........seu codigo
add( new JScrollPane(p) );
k++;
}
G

esse p aí é o que? O Painel do thumb?

porque no meu código, este p é apenas um painel dos vários que conterão as Imagens

L

Gabriel Lopes:
esse p aí é o que? O Painel do thumb?

porque no meu código, este p é apenas um painel dos vários que conterão as Imagens

Sim. Tente isso ou entao depois remova essa linha que falei para tentar e tente isso:

private void exibeGUI(){  
        JFrame tmp = new JFrame();  
        tmp.setSize(1024,768);  
        ThumbNail thumb = new ThumbNail(listaImagens,parametros[2], 120, 100,control);  
        tmp.add( new JScrollPane( thumb ), BorderLayout.EAST );  // modifique aqui, não esqueça de importar a classe JScrollPane
          
        tmp.setLocationRelativeTo(null);  
          
        tmp.setVisible(true);  
}
G

Certo, na parte da tarde darei notícias!

Obrigado!

G

Veeeio!! Deu certim cara!!

Só que tipo, eu tava querendo adicionar o scrollpane de DENTRO do Thumb, por que vout ransformar em jar depois…

Daí tou tentando aqui :x!!

L

Gabriel Lopes:
Veeeio!! Deu certim cara!!

Só que tipo, eu tava querendo adicionar o scrollpane de DENTRO do Thumb, por que vout ransformar em jar depois…

Daí tou tentando aqui :x!!

Qual tentativa que eu passei que funcionou? Coloca aqui para quando alguem tiver a mesma duvida e pesquisar e achar esse tópico souber. Como assim de DENTRO do Thumb? E não esquece de editar seu primeiro post e colocar como resolvido no assunto do topico

G

lucas_guj:
Gabriel Lopes:
esse p aí é o que? O Painel do thumb?

porque no meu código, este p é apenas um painel dos vários que conterão as Imagens

Sim. Tente isso ou entao depois remova essa linha que falei para tentar e tente isso:

private void exibeGUI(){  
        JFrame tmp = new JFrame();  
        tmp.setSize(1024,768);  
        ThumbNail thumb = new ThumbNail(listaImagens,parametros[2], 120, 100,control);  
        tmp.add( new JScrollPane( thumb ), BorderLayout.EAST );  // modifique aqui, não esqueça de importar a classe JScrollPane
          
        tmp.setLocationRelativeTo(null);  
          
        tmp.setVisible(true);  
}

Este método ExibeGUI() está em outra classe, eu queria criar o jscrollpane dentro da própria classe ThumbNail…

Só que não dá porque ela é um panel…

L

Eu falei para você fazer isso porque voce tinha me falado que seriam varios thumbs então pensei em colocar ai que é na criação do objeto, ai ficaria adicionado em um JScrollPane para cada objeto. Não esqueça de colocar tópico como resolvido. Qualquer coisa que eu puder ajudar eu falo. abraços

G

Não não… Thumb = painel que contém vários painéis que contem imagem + nome da imagem.

Só terei 1 Objeto thumb… daí eu já queria uqe ele viesse com o jscrollpane!

Entendeu?

L

Gabriel Lopes:
Não não… Thumb = painel que contém vários painéis que contem imagem + nome da imagem.

Só terei 1 Objeto thumb… daí eu já queria uqe ele viesse com o jscrollpane!

Entendeu?

Ahhhh sim, entendi. Minha dificuldade toda em te ajudar foi a interpretação da sua dúvida. aSHDUIOADSHISHAIHDSI…Mas pelo visto consegui ajudar mesmo interpretando errado. Mas agora entendi. Abraços

G

aheuaheuaheaheuaheuah, eu ainda estou com problema!! Não foi resolvido ainda!!

L

Qual o seu problema? Ué você tinha falado que tinha dado certinho. É um problema novo? Mas pelo menos o problema inicial foi resolvido? Tente explicar bem detalhado que as vezes eu sou ruim de entender certas coisas.

G

"
Este método ExibeGUI() está em outra classe, eu queria criar o jscrollpane dentro da própria classe ThumbNail…

Só que não dá porque ela é um panel… "

É o problema inicial ainda, eu consegui adicionar o scrollpane só que de fora da classe ThumbNail (que é um panel).

Queria adicionar o scroll de dentro da classe. Fiz o thumbnail como sendo um panel porque achei que fosse o certo.

L

Gabriel Lopes:
"
Este método ExibeGUI() está em outra classe, eu queria criar o jscrollpane dentro da própria classe ThumbNail…

Só que não dá porque ela é um panel… "

É o problema inicial ainda, eu consegui adicionar o scrollpane só que de fora da classe ThumbNail (que é um panel).

Queria adicionar o scroll de dentro da classe. Fiz o thumbnail como sendo um panel porque achei que fosse o certo.

Claro que dá, ele é um painel vamos dizer pai dos outros paines que vao ter as imagens e o nome da imagem certo? Tem como voce colocar o construtor da classe ThumbNail aqui? aquele metodo private void ajustaImagensThumbNail() é o metodo para criar os outros paineis com imagens certo?

G
public ThumbNail(List<File> imagens,String desc, int h, int w,Controlador c) {
        control = c;
        altura = h;
        largura = w;       
        listaArqImagens = imagens;
        listaImagens = apanhaImagens();
        descricao = desc;
        listaBfi = apanhaListaThumbNail(listaImagens);
        
        configInicial();
        
        ajustaImagensThumbNail();        
    }



/*ConfigInicial*/
private void configInicial() {
        GridLayout testeLay = new GridLayout(0, 2);
        testeLay.setVgap(20);
        setLayout(testeLay);
        
        setBorder(BorderFactory.createEtchedBorder());
        setSize(400, 600);
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        setLocation(screenSize.width-getWidth(), (screenSize.height-getHeight()+5)/2);        
        
        
    }
L

Tente no construtor:

add( new JScrollPane(this) );

configInicial(); 

ajustaImagensThumbNail();
G

adding container’s parent to itself

L

E assim? No construtor.

JScrollPane rollover = new JScrollPane();

rollover.setViewportView(this);

Ta foda isso ai heim AHSDUIOHASIDHIASHD…To te ajudando mas to aprendendo junto contigo.

L

Cara é porque eu to estudando para concurso e te ajudando ao mesmo tempo aqui senão ja tinha lido a classe na API Java e visto como resolver isso.

L

E mostra como seu código todo está agora porque já ate me perdi de quantas alterações você fez ai.

G
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package GUI;

import GUI.Interpretador;
import control.Controlador;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.BevelBorder;
import javax.swing.border.EtchedBorder;
import modelo.Debug;

/**
 *
 * @author GABRIEL
 */
public class ThumbNail extends JPanel {

    private Component c;
    private List<File> listaArqImagens;
    private List<Image> listaImagens;
    private List<BufferedImage> listaBfi;
    private int altura, largura;
    private String descricao;
    private SlideShow slide;
    private Controlador control;
    private JPanel pnlThumb;
    
    public ThumbNail(List<File> imagens,String desc, int h, int w,Controlador c) {
        control = c;
        altura = h;
        largura = w;       
        listaArqImagens = imagens;
        listaImagens = apanhaImagens();
        descricao = desc;
        listaBfi = apanhaListaThumbNail(listaImagens);
        
       JScrollPane p = new JScrollPane();
       p.setViewportView(this);
        configInicial();
        
        ajustaImagensThumbNail();        
    }
    
    private List<Image> apanhaImagens(){
        List<Image> t = new ArrayList<Image>();
        for(File f : listaArqImagens){
            if(f.getName().endsWith("jpg") || f.getName().endsWith("jpeg")){
                try {
                    t.add(ImageIO.read(f));
                } catch (IOException ex) {
                    Logger.getLogger(Interpretador.class.getName()).log(Level.SEVERE, null, ex);
                    control.exit(ex);
                }
            }
        }
        return t;
    }
    
    private void ajustaImagensThumbNail(){
        
        JLabel img;
        JLabel nomeImg;
        JPanel p;
        BorderLayout pnlLay;
        int k = 0;
        
        for (BufferedImage i : listaBfi) {
            /*Cria o Painel que estará a imagem*/
            pnlLay = new BorderLayout(5, 0);
            p = new JPanel(pnlLay);
            configuraMouseListener(p);
            
            /*Configura as Labels que serão adicionadas no painel*/
            img = new JLabel(new ImageIcon(i));  
            nomeImg = new JLabel(listaArqImagens.get(k).getName());
            
            /*Posiciona corretamente dentro do painel*/
            p.add(img,pnlLay.WEST);
            p.add(nomeImg,pnlLay.SOUTH);
            
            add(p);
            k++;           
        }
    }
    
    private void configuraMouseListener(Component c){
        c.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent evt){
                    JPanel panel = (JPanel)evt.getSource();
                    JLabel label = (JLabel) panel.getComponents()[0];
                    ImageIcon i = (ImageIcon)label.getIcon();                                      
                    slide = new SlideShow(listaImagens,3000,i.getImage(),control);                 
                    
                }
            });
    }
    
    public Image ampliaImagem(Image img){
        return img;
    }
    
    private List<BufferedImage> apanhaListaThumbNail(List<Image> imagens) {
        BufferedImage bf, tmp;
        Graphics2D graphics;
        List<BufferedImage> listaBfi = new ArrayList<BufferedImage>();

        for (Image i : imagens) {
            /*
             * Cria um objeto afim de desenhá-lo, com mesmas proporções da imagem
             */
            bf = new BufferedImage(largura, altura, BufferedImage.TYPE_INT_RGB);
            graphics = bf.createGraphics();
            /*
             * Desenha a imagem no objeto bf
             */
            graphics.drawImage(i, 0, 0, largura, altura, null);

            listaBfi.add(bf);
        }

        return listaBfi;
    } 
    
    private void configInicial() {
        GridLayout testeLay = new GridLayout(0, 2);
        testeLay.setVgap(20);
        setLayout(testeLay);
        
        setBorder(BorderFactory.createEtchedBorder());
        setSize(400, 600);
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        setLocation(screenSize.width-getWidth(), (screenSize.height-getHeight()+5)/2);        
        
        
    }
}
G

Nada… tou pelejando aqui também.

L

CAra uma pergunta bem básica, esse ThumbNail que é um painel não está contido em um JFrame não? Se estiver, coloca o código do JFrame ai.

G

Ele é um pane exatamente para ser adicionado por um frame.

A Classe interpretador faz isso com aquele código exibeGUI() que já mencionei aqui…

Cara, acho que vou deixar assim mesmo…

Eu queria já enviá-lo com scroll porque ficaria melhor, já que transformarei-o em lib… pois foi um grande problema pra mim fazer ThumbNail…

Muitíssimo obrigado aí brother!!!

Criado 29 de abril de 2012
Ultima resposta 30 de abr. de 2012
Respostas 32
Participantes 2