Лентите за превъртане не се показват в JScrollPane

Искам да направя прозорец с два бутона с голяма височина и лента за превъртане отстрани. Проблемът е, че не се появява лента за превъртане. Ето моят код

public class Window {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub

    //namestanje teme
    try {
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InstantiationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (UnsupportedLookAndFeelException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    JFrame frame = new JFrame("frame");
//  frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    frame.setSize(500,500);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel panel = new JPanel(null);

    JButton but1 = new JButton();
    JButton but2 = new JButton();

    panel.add(but1);
    panel.add(but2);

    but1.setSize(50, 505);
    but2.setSize(50, 505);

    but1.setLocation(0, 0);
    but2.setLocation(400, 400);

    but1.setText("1");
    but2.setText("2");


    JScrollPane scroll = new JScrollPane(panel);

    frame.add(scroll);
    frame.setVisible(true);         
}
}

Забележка: Първоначално бутоните имаха големи ширини (направи това, като ги наименува с нещо като "11111111111111111111111111111") и се появява лента за превъртане. Тогава исках големи височини и трябваше да сложа нула в панела. Сега не се появява лента за превъртане.


person Damjan    schedule 10.07.2011    source източник
comment
Защо използвате Null Layout? Освен това трябва да извиквате setPreferredSize(...), а не setSize(...). Каква е целта ви тук?   -  person mre    schedule 10.07.2011
comment
Бяха ли наистина необходими 16 реда за настройка на Nimbus PLAF за демонстриране на проблема? Докато сте по темата, моля, обмислете публикуването на SSCCE в бъдеще.   -  person Andrew Thompson    schedule 11.07.2011


Отговори (2)


Ленти за превъртане се появяват, когато предпочитаният размер на компонента, добавен към екрана за превъртане, е по-голям от размера на екрана за превъртане.

Задача на мениджъра на оформлението е да определи предпочитания размер на панела. Също така задача на мениджъра на оформлението е да определи размера и местоположението на компонентите, добавени към панела.

Отървете се от нулевото оформление и използвайте мениджър на оформление и лентите за превъртане ще се появят автоматично, когато е необходимо.

Ако искате компонентите да се показват по различен начин от вертикална гледна точка, тогава трябва да използвате различен мениджър на оформлението. Може би можете да използвате BoxLayout с вертикално оформление. Можеш да използваш:

panel.add( Box.createVerticalStrut(400) );

за добавяне на вертикално пространство между двата компонента.

person camickr    schedule 10.07.2011

За да направите лентата за превъртане винаги да се показва, използвайте:

yourScrollBar.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

...

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

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        //namestanje teme
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnsupportedLookAndFeelException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        JFrame frame = new JFrame("frame");
    //  frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setPreferredSize(new Dimension(100,95));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();

        JButton but1 = new JButton();
        JButton but2 = new JButton();

        panel.add(but1);
        panel.add(but2);

        but1.setSize(50, 505);
        but2.setSize(50, 505);

        but1.setLocation(0, 0);
        but2.setLocation(400, 400);

        but1.setText("1");
        but2.setText("2");


        JScrollPane scroll = new JScrollPane(panel);
        scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

        frame.setLayout(new FlowLayout());
        frame.pack();
        frame.add(scroll);
        frame.setVisible(true);         
    }

}
person Eng.Fouad    schedule 10.07.2011
comment
Може да се появи, но няма да работи. Не трябва да използвате setSize() и setLocation(). - person camickr; 10.07.2011