2015-03-02 6 views
1
JPanel panel = new JPanel(new GridLayout(0,1)); 
JScrollPane contentpane = new JScrollPane(panel); 
JButton add = new JButton("ADD"); 
add.actionListener(new ActionListener() { 
    public void actionPerformed(){ 
      MyPanel newpanel = new MyPanel("title","Button"); //MyPanel is a class which extends JPanel and contains constructor MyPanel(String TitleToSet ,String ButtonTitleTOAdd) 
      panel.add(newpanel); 
      panel.repaint(); 
    }) ; 

Я использовал этот код, думая, что он добавит MyPanel в макет сетки динамически и «панель» будет прокручивать если добавить больше «MyPanel» s. Однако это было не так, первая «MyPanel» заполнила целую «панель» и добавила вторую «MyPanel» (нажав кнопку «Добавить»), первая «MyPanel» была сжата, чтобы освободить место для второго. и при добавлении большего, все «MyPanel» были вписаны в окно просмотра, а не «прокручивали панель». Как добавить эти «MyPanel» динамически и сделать «панель» прокручиваемой при добавлении большего количества из них? Любая помощь будет оценена по достоинству.Динамически добавить фиксированную высоту панелей к JScrollPane

ответ

1

http://docs.oracle.com/javase/7/docs/api/javax/swing/JScrollPane.html:

По умолчанию JScrollPane использует ScrollPaneLayout для обработки макета его дочерних компонентов. ScrollPaneLayout определяет размер, чтобы сделать вид видовых одним из двух способов:

  1. [...]
  2. GetPreferredSize используется.

Вы должны добавить строку

panel.setPreferredSize(new Dimension(0, panel.getComponents().size() * SUB_PANEL_HEIGHT)); 

к вашему ActionListener.

Полный пример:

package main; 

import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.Panel; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.Timer; 

class Test { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setPreferredSize(new Dimension(400, 400)); 
     frame.setSize(400, 400); 

     JPanel panel = new JPanel(new GridLayout(0, 1)); 
     panel.add(new JLabel("BOO")); 
     panel.add(new JButton("BBBB")); 

     JScrollPane contentpane = new JScrollPane(panel); 
     frame.add(contentpane); 

     new Timer(1000, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       JPanel newpanel = new JPanel(); 
       newpanel.add(new JLabel("LOL")); 
       panel.add(newpanel); 
       System.out.println(100 * panel.getComponents().length); 
       panel.setPreferredSize(new Dimension(0, 100 * panel.getComponents().length)); 
       contentpane.validate(); 
      } 
     }).start(); 

     frame.setVisible(true); 
    } 
} 
+0

Спасибо, он работал отлично ,, я даже пытался использовать абсолютный макет. Однако я не понял эту часть, когда вы задали предпочтительный размер, почему вы установили ширину панели 0 ?? [panel.setPreferredSize (новый размер (0, 100 * panel.getComponents(). length));] –

+0

JScrollPane устанавливает ширину представления в max (view.getPreferredSize(). getWidth(), scrollPane.getWidth()). Установив предпочтительную ширину представления равным 0, я гарантирую, что прокрутка выполняется только по вертикали. –

Смежные вопросы