Olá pessoal, estou com o seguinte problema: estou carregando uma imagem em um JLabel com um tamanho pré-determinado, ou seja, se ela for maior que o JLabel ela é redimensionada para o tamanho do JLabel, mas o que acontece é que pode ser que o “cara” queira a imagem no tamano original, então eu quero colocar uma barra de rolagem no JLabel, isso é possível?
Colocar uma barra de rolagem no JLabel não, mas colocar o seu JLabel dentro de um JScrollPane sim.
Referências:
http://java.sun.com/docs/books/tutorial/uiswing/components/scrollpane.html
http://java.sun.com/javase/6/docs/api/javax/swing/JScrollPane.html
Porque que a barra de rolagem não está aparecendo?
public void montaJLabel() {
painel = new JPanel();
Icon img = new ImageIcon(getClass().getResource("radiografia.jpg"));
lblTeste = new JLabel(img);
lblTeste.setBackground(Color.cyan);
lblTeste.setOpaque(true);
painel.add(lblTeste);
scroll = new JScrollPane();
scroll.getViewport().setBorder(null);
scroll.setViewportView(lblTeste);
scroll.setSize(400,300);
setContentPane(scroll);
}
Acho que você deve inserir em vez de no JScrollPane. Não se esqueça também de definir o tamanho do JLabel com lblTeste.setSize(), de modo que extrapole o tamanho do JScrollPane.
O JLabel está tomando a área inteira do formulario.
public void montaJLabel() {
painel = new JPanel();
Icon img = new ImageIcon(getClass().getResource("radiografia.jpg"));
lblTeste = new JLabel(img);
lblTeste.setBackground(Color.cyan);
lblTeste.setOpaque(true);
lblTeste.setBounds(10,10,500,500);
add(lblTeste);
scroll = new JScrollPane();
scroll.getViewport().setBorder(null);
scroll.setViewportView(lblTeste);
scroll.setSize(400,300);
setContentPane(scroll);
}
Faça exatamente o que o roger_rf disse que deve funcionar. Veja:
public void montaJLabel() {
// o painel é que será adicionado
painel = new JPanel();
// logo, ele deve ter um tamanho maior do que o JScrollPane possa exibir
painel.setPreferredSize(new Dimension(1500,1500));
Icon img = new ImageIcon(getClass().getResource("radiografia.jpg"));
lblTeste = new JLabel(img);
lblTeste.setBackground(Color.cyan);
lblTeste.setOpaque(true);
// adiciono o JLabel no JPanel
painel.add(lblTeste);
scroll = new JScrollPane();
// adiciono o JPanel no JScrollPane
scroll.setViewportView(painel);
setContentPane(scroll);
}
Valeu rapaziada deu certinho, Abraços.
Só mais uma coisa, como eu faço para encerrar este tópico?
Não há procedimento específico para encerrar um tópico, a única recomendação é adicionar o tag “[RESOLVIDO]” ao título do tópico, para que os demais participantes saibam que a discussão já terminou.
Olá pessoal, houve um pequeno equivoco, na verdade não deu certo pq, eu quero adicionar a barra no própio painel e não no formulário, quando eu faço
setContentPane(scroll), a barra é adicionada no formulário (JFrame), e o fato é que o painel não tem este método e se eu utilizo o método painel.add(scroll) ocorre erro em tempo de execução.
:?: :?: :?:
Sei que o tópico é um tanto antigo mas vou responder porque pode ser útil para outras pessoas que passam pelo GUJ.
Eu também estava com esse mesmo problema e resolvi ele usando a sugestão do pessoal que postou acima. A unica diferença é que eu direcionei os scrolls nos meus panels. Abaixo está o trexo do meu código em que uso scroll nas imagens.
public class ZWindow extends JFrame implements ActionListener, AdjustmentListener {
private JScrollPane scroll1, scroll2;
private JPanel panel1, panel2;
private ImageIcon image1, image2;
private JToolBar toolBar;
private JButton applayFilter, applayQuadTree, findImage;
private JSlider tolerance;
public ZWindow(){
super("ZImage");
this.setSize(1010, 600);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(null);
this.applayFilter = new JButton("Aplicar Filtro");
this.applayQuadTree = new JButton("Aplicar Quad-Tree");
this.findImage = new JButton("Procurar...");
this.applayFilter.addActionListener(this);
this.applayQuadTree.addActionListener(this);
this.findImage.addActionListener(this);
this.tolerance = new JSlider(0, 50);
this.tolerance.setValue(10);
this.toolBar = new JToolBar("Ferramentas");
this.toolBar.setBounds(0, 0, 1000, 30);
this.toolBar.setFloatable(false);
this.add(toolBar);
this.toolBar.add(this.applayFilter);
this.toolBar.add(this.applayQuadTree);
this.toolBar.add(this.tolerance);
this.toolBar.addSeparator(new Dimension(50, 0));
this.toolBar.add(new JLabel("Imagem:"));
this.toolBar.add(new JTextField());
this.toolBar.add(this.findImage);
this.panel1 = new JPanel();
this.panel2 = new JPanel();
this.panel1.add(new JLabel("Image", JLabel.CENTER));
this.panel2.add(new JLabel("Image", JLabel.CENTER));
this.scroll1 = new JScrollPane(panel1);
this.scroll2 = new JScrollPane(panel2);
this.scroll1.setViewportView(panel1);
this.scroll2.setViewportView(panel2);
this.scroll1.setBounds(0, 40, 500, 500);
this.scroll2.setBounds(500, 40, 500, 500);
this.scroll1.getHorizontalScrollBar().addAdjustmentListener(this);
this.scroll1.getVerticalScrollBar().addAdjustmentListener(this);
this.scroll2.getHorizontalScrollBar().addAdjustmentListener(this);
this.scroll2.getVerticalScrollBar().addAdjustmentListener(this);
this.add(scroll1, BorderLayout.WEST);
this.add(scroll2, BorderLayout.EAST);
//TODO: Abre uma imagem de exemplo.
// ImageIcon nativeImage = new ImageIcon(ClassLoader.getSystemResource("test.jpg"));
ImageIcon nativeImage = new ImageIcon(ClassLoader.getSystemResource("Xianghua.jpg"));
refreshImages(nativeImage, null);
}
//Resto da classe...
}
Espero ter ajudado!
Abraço! o/
E o método refreshImages:
public void refreshImages(ImageIcon image1, ImageIcon image2){
if(image1 != null){
panel1.remove(0);
panel1.add(new JLabel(image1, JLabel.CENTER));
this.image1 = image1;
}
if(image2 != null){
panel2.remove(0);
panel2.add(new JLabel(image2, JLabel.CENTER));
this.image2 = image2;
}
paintAll(getGraphics());
}