2012-11-13 14 views
5

Jak mogę ograniczyć szerokość widoku JScrollPanel? Nie chcę, aby poziome przewinięcie miało miejsce w każdym przypadku. Próbowałem dostarczyć własne JViewport, ale to niewiele pomaga.Ogranicz szerokość widoku JScrollPane

private static class WidthRestrictingViewport extends JViewport { 
     private Container contents; 

     public WidthRestrictingViewport(final Container cnts) { 
      contents = cnts; 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      if (getParent() instanceof JScrollPane) { 
       JScrollPane sp = (JScrollPane) getParent(); 
       return new Dimension(sp.getWidth(), contents.getHeight()); 
      } 
      return super.getPreferredSize(); 
     } 

     @Override 
     public Dimension getMaximumSize() { 
      return getPreferredSize(); 
     } 
    } 

I kod, który tworzyć JScrollPane

Container fpdp = .... 

    JScrollPane sp = new JScrollPane(); 
    sp.setViewport(new WidthRestrictingViewport(fpdp)); 
    sp.setViewportView(fpdp); 

contents instancji, że dostawa ma maksymalną szerokość, jednak chcę jej szerokość będzie nie więcej niż JScrollPane szerokość tak poziome przewijanie przyzwyczajenie się zdarzyć. Co ja robię źle?

+1

Nie rozumiem pytania. Co powinno się stać z zawartością 'JScrollPane', gdy jest szerszy niż rzeczywisty rozmiar' JScrollPane'. Po prostu odciąć? W takim przypadku możesz rozważyć właśnie uczynienie paska przewijania niewidocznym ('JScrollPane # getHorizontalScrollBar # setVisible (false)'); – Robin

+0

@Robin, Nie obcięty. Zmniejsz szerokość widoku do szerokości okna przewijania. Wyobraź sobie panel z układem granicznym i zawartością umieszczonymi w środku. Ale w tym przypadku szerokość tylko zawartości jest ograniczona szerokością panelu, a wysokość zawartości może rosnąć zgodnie z potrzebami (z dodawaniem paska przewijania). –

+1

Nie uważam, że odpowiedzialność za "ograniczenie widoków", jakie może osiągnąć "JViewPort", dotyczy raczej samego widoku. Spójrz na interfejs ['Scrollabe'] (http://docs.oracle.com/javase/7/docs/api/javax/swing/Scrollable.html), w szczególności [' Scrollable # getScrollableTracksViewportWidth'] (http : //docs.oracle.com/javase/7/docs/api/javax/swing/Scrollable.html#getScrollableTracksViewportWidth%28%29) – MadProgrammer

Odpowiedz

2

Przepraszamy za moje słabe wyjaśnienia. Znalazłem sposób na zrobienie tego. Dzięki JScrollpane needs to shrink its width.

Jeszcze jeden problem, z którym miałem do czynienia, to niewłaściwy menedżer układu w ScrollablePanel. To był FlowLayout, który wkręcił wszystkie rzeczy. Nie zrozumiałem go od razu i pomyślałem, że problem jest związany z używaniem interfejsu Scrollable.

Po prostu wziąłem ScrollablePanel i ustawiłem jego menedżera układu na BorderLayout i to już wszystko w porządku!