Как получить вертикальную прокрутку до JPanel? - PullRequest
4 голосов
/ 18 февраля 2010

Я написал код в java с использованием swing, так что мне нужно добавить JscrollPane в 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

   '

   '

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

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

Кто-нибудь может мне помочь?

Ответы [ 7 ]

7 голосов
/ 18 февраля 2010

Вы должны использовать соответствующий 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);

Взгляните на этот урок: Размещение компонентов внутри контейнера (визуальное руководство - хорошая отправная точка)

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]);
3 голосов
/ 18 февраля 2010

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

1 голос
/ 18 февраля 2010

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

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

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

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

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

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

alt text

Был создан этот (измененная версия вашего) кода:

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();
}

}

Надеюсь, это поможет.

1 голос
/ 18 февраля 2010

Для размера кнопок используйте preferredSize

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

panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
1 голос
/ 18 февраля 2010

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

0 голосов
/ 07 октября 2016

А как же?

JScrollPane scrollPane = new JScrollPane(yourpanel);
container.add(scrollPane);
0 голосов
/ 15 декабря 2011

Можно также получить вертикальную прокрутку для 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.

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