2010-02-18 2 views
4

Я написал код в Java с помощью свинг, так что у меня будет JScrollPane добавил к JPanel, а затем я буду добавлять кнопки фиксированного размера для JPanel в вертикальной модеКак получить вертикальную прокрутку к JPanel?

JPanel panel=new JPanel(); 
    panel.setBackground(Color.WHITE); 

    int v=ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS; 
    int h=ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS; 
    JScrollPane jsp=new JScrollPane(panel,v,h); 
    jsp.setPreferredSize(new Dimension(600,600)); 
    jsp.setBounds(150,670,850,200); 
    frame.add(jsp); 

тогда я добавляющие кнопки к нему во время выполнения.

 for(i=0;i<n;i++) 
    { 
     button[i]=new JButton(); 
     button[i].setBounds(20,y,120,120); 
     button[i].setSize(120,120); 
     button[i].setToolTipText(file[i].toString());  
     button[i].setIcon(Icon); 
     panel.add(button[i]); 
     y=y+140; 
    } 

Я хочу добавить на кнопки одну под другой ... (то есть я хочу вертикальную полосу прокрутки)

т.е. button1

button2 

    ' 

    ' 

но выше код дает мне кнопки в line (т.е. я получаю горизонтальную полосу прокрутки) ie button1 button2 ...

другой проблемой является размер кнопок. Использование btn.setSize() не влияет на размер вообще ...

Может ли кто-нибудь мне помочь?

ответ

7

Вы должны использовать соответствующий LayoutManager как GridLayout, BoxLayout или GridBagLayout для панели.
Это зависит от того, что еще вы хотите поместить в панель.

GridLayout проще использовать IMO:

JPanel panel = new JPanel(); 
panel.setLayout(new GridLayout(0, 1)); // any number of rows, 1 column 
... 
    panel.add(button[i]); 

BoxLayout почти так же легко:

JPanel panel = new JPanel(); 
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
... 
    panel.add(button[i]); 

GridBagLayout является более мощным, что позволяет более чем один столбец, компоненты, охватывающие более одной ячейки,. .. нуждается в GridBagConstraints для добавления элементов:

JPanel panel = new JPanel(); 
panel.setLayout(new GridBagLayout()); 
GridBagConstraints constraints = new GridBagConstraints(
    0, RELATIVE, // x = 0, y = below previous element 
    1, 1,   // cell width = 1, cell height = 1 
    0.0, 0.0  // how to distribute space: weightx = 0.0, weighty = 0,0 
    GridBagConstraints.CENTER, // anchor 
    GridBagConstraints.BOTH, // fill 
    new Insets(0, 0, 0, 0),  // cell insets 
    0, 0);   // internal padding 
... 
    panel.add(button[i], constraints); 

Посмотрите на t его учебник: Laying Out Components Within a Container (Визуальное руководство является хорошей точкой старта)

EDIT:
вы также можете выложить компоненты вручную, то есть, указать местоположение и размер каждого компонента в контейнере ,Для этого вы должны установить LayoutManager в null, чтобы удалить менеджер по умолчанию.

JPanel panel = new JPanel(); 
panel.setLayout(null); 
... 
    button[i].setLocation(x, y); 
    button[i].setSize(width, heigth); 
    // OR button[i].setBounds(x, y, width, height); 
    panel.add(button[i]); 
1

Вы должны установить LayoutManager для JPanel или использовать Box (BoxLayout.Y_AXIS).

3

Вам необходимо определить подходящий LayoutManager для вашего JPanel, который отвечает за то, как позиционируются Component с ним. По умолчанию LayoutManager: FlowLayout, который выдает Component с левой стороны вправо. Для выкладки s вертикально следует рассмотреть возможность использования BoxLayout или GridBagLayout.

1

Для размера пуговиц используйте preferredSize

Для вашей проблемы макета вам необходимо изменить менеджер компоновки на один, что делает вертикальную компоновку. Для игры вокруг цели вы можете использовать BoxLayout как это:

panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
1

Это намного проще, если вы позволите layout manager делать свою работу.

В Swing, как компоненты компоновки над другим компонентом (например, панель) использует диспетчер компоновки.

Используется, чтобы избежать необходимости вычислять координаты всех компонентов друг против друга при каждом изменении размера компонента контейнера или добавлении нового компонента.

Существует несколько макетов, которые вам нужны здесь BoxLayout.

С помощью этого макета вам не нужно указывать положение кнопки или его размер. Менеджер компоновки запрашивает каждый компонент и использует эту информацию для размещения их в правильном положении и размере.

Например следующий кадр

alt text http://img691.imageshack.us/img691/4016/samplepl.png

Был создан этот (модифицированную версию) Код:

import javax.swing.*; 
import java.awt.*; 
public class ScrollTest { 

    private JPanel panel; 
    private Icon[] icons = new Icon[3]; 


    public void main() { 
     panel =new JPanel(); 

     // Use top to bottom layout in a column 
     panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 


     panel.setBackground(Color.WHITE); 

     int v=ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS; 
     int h=ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS; 
     JScrollPane jsp=new JScrollPane(panel,v,h); 
     jsp.setPreferredSize(new Dimension(600,600)); 
     jsp.setBounds(150,670,850,200); 
     JFrame frame = new JFrame(); 
     frame.add(jsp); 

     // my addition to load sample icons 
     loadImages(); 
     // simulate dynamic buttons 
     addButtons(); 

     frame.pack(); 
     frame.setVisible(true); 

    } 
    void loadImages() { 
     icons[0] = new ImageIcon("a.png"); 
     icons[1] = new ImageIcon("b.png"); 
     icons[2] = new ImageIcon("c.png"); 
    } 

    void addButtons() { 
     for(int i = 0 ; i < icons.length ; i++) { 
      JButton button = new JButton(); 
      Icon icon = icons[i]; 
      button.setIcon(icon); 
      // Set the button size to be the same as the icon size 
      // The preferred size is used by the layout manager 
      // to know what the component "better" size is. 
      button.setPreferredSize(new Dimension(icon.getIconWidth(), 
                icon.getIconHeight())); 
      // This is IMPORTANT. The maximum size is used bythe layout manager 
      // to know "how big" could this component be. 
      button.setMaximumSize(button.getPreferredSize()); 
      panel.add(button); 
     } 
} 
public static void main(String ... args) { 
    new ScrollTest().main(); 
} 

}

Я надеюсь, что это помогает.

0

Также можно получить вертикальную прокрутку для JPanel с SpringLayout. Возможно, если вертикальный размер панели будет определяться установкой ограничения SpringLayout.SOUTH. Это можно сделать так:

JPanel panel = new JPanel(); 
SpringLayout panelLayout = new SpringLayout(); 
panel.setLayout(panelLayout); 

// Adding components to the panel here 
// ..... 

// That's what defines panel's exact size and makes its scrolling possible 
panelLayout.putConstraint(SpringLayout.SOUTH, panel, 0, 
     SpringLayout.SOUTH, lastComponentOfThePanel); 

JScrollPane panelScrollPane = new JScrollPane(panel); 

где lastComponentOfThePanel является компонентом в нижней части панели.

Надеюсь, это поможет кому-то. На мой взгляд, SpringLayout - очень мощный менеджер компоновки, и иногда очень сложно или почти невозможно заменить его GridBagLayout.

0

Как насчет?

JScrollPane scrollPane = new JScrollPane(yourpanel); 
container.add(scrollPane); 
Смежные вопросы