2009-09-06 15 views
12

Jak zrobić przewijany JPanel? I wdrożone przewijaną interfejsu jeszcze podczas dodawania go do panelu zawierającego zPrzewijany JPanel

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

nic nie działa

Kod:

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

Odpowiedz

8

Musisz użyć JScrollPane. A następnie zadzwoń pod numer setViewportview(Component);

Nie trzeba zaimplementować przewijania, JPanel jest allready przewijane

+3

Możesz dodać dowolny komponent do JScrollPane, niezależnie od tego, czy implementuje Scrollable, czy nie, ale implementacja Scrollable da ci większą kontrolę. JPanel nie implementuje Scrollable, więc musisz go podklasować, jeśli chcesz mieć większą kontrolę nad zachowaniem panelu przewijania podczas wyświetlania panelu. –

+0

(Możesz też ustawić właściwości na 'JScrollPane' /' JScrollBar's bez implementowania czegokolwiek.) –

+0

@Dan: Tak, ale nigdy nie powiedziałem 'narzędzi' –

1

Jak wspomniano we wszystkich pozostałych delegowania nie ma powodu do wdrożenia Przewijany interfejs siebie. Jeśli jednak po prostu bawisz się w kółko, podstawowy kod opublikowany wygląda rozsądnie. Jednak nie opublikowałeś programu demonstracyjnego pokazującego, w jaki sposób używasz tego kodu. W przyszłości opublikuj SSCCE swoim pytaniem. Jeśli nie wiesz, co to jest SSCCE, przeszukaj sieć.

Po ewentualnym problemie paski przewijania są wyświetlane automatycznie, gdy "preferowany rozmiar" komponentu dodanego do rzutni suwaka jest większy niż rozmiar suwaka.

Jeśli wykonujesz niestandardowe malowanie na panelu, odpowiadasz za ustawienie preferowanego rozmiaru panelu podczas jego zmiany. Jeśli używasz panelu z komponentami i menedżerem układu, nie musisz się o to martwić. Ale jeśli używasz komponentów z menedżerem układu zerowego, będziesz mieć również problemy.

Dlatego potrzebujemy SSCCE, ponieważ nie znamy kontekstu, w jaki sposób korzystasz z panelu.

0

Mam dla ciebie nowe rozwiązanie.

Myślę, że trzeba użyć tego kodu:

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 

Było to rozwiązanie dla mnie. Mam nadzieję, że do ciebie!

22

on pracował ze mną w ten sposób ....

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

Należy zauważyć, że nie masz kontroli nad przyrostem przewijania, tj. Każde kliknięcie przycisku przewijania lub każdego skrętu kółka myszy powoduje przewijanie jednego piksela, który musisz pokonać - na wszelki wypadek - poprzez zastosowanie opcji "Przewijany". –

1

JPanel nie realizuje Przewijany. Lepiej jest używać JXPanel z SwingX, który implementuje Scrollable i ma wiele więcej funkcji.