2014-02-16 2 views
2

У меня есть следующая маленькая программа:Создать панель с горизонтальной оберткой и вертикальной прокрутки

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.FlowLayout; 

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

public class ScrollPanePlay extends JFrame 
{ 
    public static void main(String[] args) 
    { 
    ScrollPanePlay frame = new ScrollPanePlay(); 
    frame.setVisible(true); 
    } 

    public ScrollPanePlay() 
    { 
    setDefaultCloseOperation(DISPOSE_ON_CLOSE); 

    JPanel panel = new JPanel(this); 
    panel.setLayout(new FlowLayout(FlowLayout.LEFT)); 
    panel.add(new JLabel("one")); 
    panel.add(new JLabel("two")); 
    panel.add(new JLabel("three")); 
    panel.add(new JLabel("four")); 
    panel.add(new JLabel("five")); 

    JScrollPane scrollPane = new JScrollPane(panel); 
    add(panel, BorderLayout.CENTER); // <== add either panel or scrollpane 
    pack(); 
    } 

} 

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

Если я добавлю панель в scrollpane и добавлю прокрутку к фрейму, то метки не будут обертываться, потому что scrollPane сообщает достаточную ширину (я думаю), чтобы удерживать все метки и позволяет пользователю прокручивать видеть их.

Я хотел бы прокрутить поведение, но только для вертикали - я хотел бы, чтобы пользователь выбирал ширину, которую он хочет видеть, и полоса прокрутки появляется только для прокрутки по вертикали. Как я могу это сделать?

Я пробовал расширять JScrollPane и возвращать true с getScrollableTracksViewportWidth(), но, как я и ожидал, это не делает то, что я хочу, потому что это ширина кадра, которую я хочу отслеживать, а не в окне просмотра. Я попытался расширить JPanel и переопределить getWidth, чтобы вернуть ширину фрейма, но все равно оставил все метки в горизонтальной строке, то есть они перестали обертывать. Есть ли что-то, что сделает это без специального менеджера макетов? Кажется мне все, что нам нужно, это программный контроль ширины окна просмотра.

+2

Возможно, проблема связана с 'FlowLayout', попробуйте взглянуть на [' WrapLayout'] (http://tips4java.wordpress.com/2008/11/06/wrap-layout/) вместо – MadProgrammer

+0

I не достигайте своей цели, так как в стороне не забудьте изменить, увеличьте прирост прокрутки – mKorbel

ответ

0

Это проблема с просмотром. Когда внутри JScrollPane JPanel не изменяет размер, чтобы соответствовать размеру JScrollPane (это своего рода причина существования ScrollPanes).

Вы можете использовать прокручиваемую панель вместо JPanel и установить ее в соответствии с максимальной шириной (в этом случае она будет соответствовать JScrollPane).

Что-то вроде:

ScrollablePanel panel = new ScrollablePanel(new BorderLayout()); 
panel.setScrollableWidth(ScrollablePanel.ScrollableSizeHint.FIT); 

Проверить это answer на несколько более общий ответ и ссылку на .class.

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