Problema com JScrollPane e JPanel

4 respostas
danieldestro

Pessoal,
Já tomei uma surra aqui do JScrollPane.

É o seguinte. Tenho dois projetos diferentes, porém nos dois quero usar o JScrollPane.

Em um dos projetos, eu exibo (add) vários JCheckBox no JPanel para que tenha rolagem. Isso funciona na boa. Veja o código:

import java.awt.*;
import javax.swing.*;

public class MyFrame extends javax.swing.JFrame {
  private JScrollPane jScrollPan = new JScrollPane();
  private JPanel pan = new JPanel();

  public MyFrame() {
    init();
    addCheckboxes();
  }

  private void init() {
    pan.setLayout(new VerticalFlowLayout());
    jScrollPan.setBounds(0, 0, 300, 100);
    jScrollPan.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
    jScrollPan.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    jScrollPan.setBorder(BorderFactory.createLineBorder(Color.black, 1));
    jScrollPan.setViewportView(pan);
    getContentPane().add(jScrollPan);
    pack();
    setSize(320,300);
  }

  private void addCheckboxes() {
	  int i=0;
	  for(; i<20; i++) {
		  JCheckBox j = new JCheckBox("CheckBox"+i);
		  pan.add( j );
	  }
	  pan.setBounds(new Rectangle(0, 0, 280, (++i)*22));
	  pan.repaint();
  }

  public static void main(String[] args) {
    MyFrame m = new MyFrame();
    m.show();
  }
}

No outro projeto, eu tento fazer quase a mesma coisa, porém, criei uma classe que estende um JPanel, que dentro contém alguns objetos, e tento adicionar vários MyJPanel para ter o mesmo resultado do projeto anterior, mas não funciona.

Veja o código:

import java.awt.*;
import javax.swing.*;

public class MyFrame2 extends javax.swing.JFrame {
  private JScrollPane jScrollPan = new JScrollPane();
  private JPanel pan = new JPanel();

  public MyFrame2() {
    init();
    addMyJPanels();
  }

  private void init() {
    pan.setLayout(new VerticalFlowLayout());
    jScrollPan.setBounds(0, 0, 300, 100);
    jScrollPan.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
    jScrollPan.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    jScrollPan.setBorder(BorderFactory.createLineBorder(Color.black, 1));
    //jScrollPan.getViewport().setLayout(null);
    jScrollPan.setViewportView(pan);
    getContentPane().add(jScrollPan);
    pack();
    setSize(320,300);
  }

  private void addMyJPanels() {
	  int i=0;
	  for(; i<20; i++) {
		  MyJPanel j = new MyJPanel();
		  pan.add( j );
	  }
	  pan.setBounds(new Rectangle(0, 0, 280, (++i)*22));
	  pan.repaint();
  }

  public static void main(String[] args) {
    MyFrame2 m = new MyFrame2();
    m.show();
  }
}

E o meu JPanel que criei:

import java.awt.*;
import javax.swing.*;
import javax.swing.border.LineBorder;

public class MyJPanel extends javax.swing.JPanel {
  private JTextField t1 = new JTextField();
  private JTextField t2 = new JTextField();
  private JTextField t3 = new JTextField();

  public MyJPanel() {
    init();
  }

  private void init() {
    setSize(306,22);
    setLayout(null);
    setBorder(new LineBorder(new Color(0, 0, 0)));
    t1.setBounds(1,1,100,20);
    t2.setBounds(103,1,100,20);
    t3.setBounds(205,1,100,20);
    add(t1);
    add(t2);
    add(t3);
  }

  public static void main(String[] args) {
    JFrame m = new JFrame();
    m.getContentPane().setLayout(null);
    m.getContentPane().add(new MyJPanel());
    m.setSize(310,50);
    m.show();
  }
}

Alguém alguma idéia porque isso não dá certo quando eu adiciono um JPanel ao invés de outro componente?

A classe VerticalFlowLayout eu achei na internet. Para pegar o arquivo, clique aqui.

Valeu!

4 Respostas

luiz_ross

Pra definir o tamanho do JPanel usa o método setPreferredSize() que tenho quase certeza que vai funcionar

danieldestro

Pois é…

Eu fiz:

pan.setLayout(null):
pan.setPreferredSize(new Dimension(x,y));

e

j.setLocation(v,w);

na classe MyFrame2 e funcionou.

Pra que serve este setPreferredSize() ???

brlima

“danieldestro”:
Pois é…

Eu fiz:

pan.setLayout(null):
pan.setPreferredSize(new Dimension(x,y));

e

j.setLocation(v,w);

na classe MyFrame2 e funcionou.

Pra que serve este setPreferredSize() ???[/code]

É o tamanho preferido do componente…rssss
Seria como um tamanho padrao ( default ) do componente.

TaQ

“danieldestro”:

Pra que serve este setPreferredSize() ???

Ele dá uma pista para renderizar o componente … do tamanho “preferido” dele. :slight_smile:
Você pode checar os métodos setMinimumSize e setMaximumSize também, dê uma olhada no JComponent:

http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JComponent.html

[]'s

Criado 4 de março de 2004
Ultima resposta 5 de mar. de 2004
Respostas 4
Participantes 4