2009-09-06 3 views
12

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

tabbedPane.add("Editor", new JScrollPane(storeyEditor = new MNScrollablePanel())); 

ничего работает

Код:

public class MNScrollablePanel extends JPanel implements Scrollable { 

    public Dimension getPreferredScrollableViewportSize() { 
     return getPreferredSize(); 
    } 

    public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { 
     return 10; 
    } 

    public boolean getScrollableTracksViewportHeight() { 
     return false; 
    } 

    public boolean getScrollableTracksViewportWidth() { 
     return false; 
    } 

    public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { 
     return 10; 
    } 
} 

ответ

8

Вы должны использовать JScrollPane. Затем вызовите setViewportview(Component);

Вы не должны выполнять прокручивать, JPanel является Allready прокручивать

+3

Вы можете добавить любой компонент в JScrollPane, независимо от того, реализует ли он прокручиваемый или нет, но реализация прокручиваемого кода даст вам больше контроля. JPanel не реализует Scrollable, поэтому вам нужно подклассифицировать его, если вы хотите больше контролировать, как ведет себя панель прокрутки при отображении панели. –

+0

(Или вы можете установить свойства на 'JScrollPane' /' JScrollBar', не выполнив ничего.) –

+0

@ Dan: Да, но я никогда не говорил «реализует» –

1

Как уже упоминались во всех других почтовых отправлениях нет никаких причин, чтобы реализовать прокрутку интерфейса самостоятельно. Однако, если вы просто играете, то базовый код выглядит разумно. Однако вы не опубликовали свою демонстрационную программу, показывающую, как вы используете этот код. В будущем отправьте SSCCE со своим вопросом. Если вы не знаете, что такое SSCCE, выполните поиск в Интернете.

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

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

Вот почему нам нужен SSCCE, потому что мы не знаем контекста того, как вы используете панель.

0

У меня есть новое решение для вас.

Я думаю, вы должны использовать этот код:

storyEditor = new JPanel(); 
storyEditor.setPreferredSize(new Dimension(..., ...)); // Insert Here your size for the editor 
JScrollPane scroller = new JScrollPane(storyEditor); 
tabbedPane.add("Editor", scroller)); 
frame.setSize(frame.getWidth()+1, frame.getHeight()); // frame is the JFrame where the tabbed pane is into 
// Maybe you can replace "frame" with "this" 
// You need to resize your frame. Why, I don't know... 
frame.pack(); 
// Your original size will be restored by calling pack 

Это было решение для меня. Надеюсь, для вас!

22

Он работал со мной, как это ....

JPanel test = new JPanel(); 
test.setPreferredSize(new Dimension(2000,2000)); 
JScrollPane scrollFrame = new JScrollPane(test); 
test.setAutoscrolls(true); 
scrollFrame.setPreferredSize(new Dimension(800,300)); 
this.add(scrollFrame); 
+0

Обратите внимание, что вы не контролируете инкремент прокрутки, то есть каждый щелчок на кнопке прокрутки или каждом повороте колесика мыши приводит к прокрутке одного пикселя, который вам нужно преодолеть - в случае, если вы хотите, - путем реализации 'Scrollable'. –

1

JPanel не реализует прокруткой. Лучше использовать JXPanel от SwingX, который реализует Scrollable и имеет намного больше возможностей.

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