2008-09-29 13 views
12

Chciałbym dodać funkcję przewijania do javax.swing.JDesktopPane. Ale zawijanie w javax.swing.JScrollPane nie powoduje pożądanego zachowania.Przewijany JDesktopPane?

Searching the web pokazuje, że jest to problem od dłuższego czasu. Tam są somesolutions, ale wydają się dość stare i nie jestem z nich całkowicie zadowolony.

Które z aktywnie konserwowane rozwiązań wiesz?

Odpowiedz

6

Użyłem JavaWorld's solution tworząc własną rękę JScrollableDesktopPane.

+0

To także moje obecne rozwiązanie, ale nie jestem nim zachwycony. Postanowiłem zapytać tutaj przed rozpoczęciem własnego projektu, aby stworzyć taki, który mi się podoba. –

1

Znalazłem to: http://www.javaworld.com/javaworld/jw-11-2001/jw-1130-jscroll.html?page=1

Jest to miły poradnik z mnóstwem wyjaśnienia i informacje o swing & tak, która pozwala stworzyć JscrollableDesktopPane z mnóstwem rzeczy.

Będziesz musiał zmodyfikować trochę części kodu, aby spełnić Twoje wymagania.

Ciesz się!

+0

Ups, zapominając o bezpośrednim linku do źródła: http://www.javaworld.com/javaworld/jw-11-2001/jscroll/jw-1130-jscroll.jar – Benj

1

Javaworld's JScrollableDesktopPane nie jest już dostępny na ich stronie internetowej. Udało mi się wyrysować kilka kopii, ale żaden z nich nie działa.

Proste rozwiązanie, które otrzymałem, można osiągnąć, wykonując następujące czynności. Nie jest najładniejsza, ale z pewnością działa lepiej niż domyślne zachowanie.

public class Window extends Frame { 
    JScrollPane scrollContainer = new JScrollPane(); 
    JDesktopPane mainWorkingPane = new JDesktopPane(); 

    public Window() { 
     scrollContainer.setViewportView(mainWorkingPane); 

     addComponentListener(new ComponentAdapter() { 
      public void componentResized(ComponentEvent evt) { 
       revalidateDesktopPane(); 
      } 
     }); 
    } 

    private void revalidateDesktopPane() { 
     Dimension dim = new Dimension(0,0); 
     Component[] com = mainWorkingPane.getComponents(); 
     for (int i=0 ; i<com.length ; i++) { 
      int w = (int) dim.getWidth()+com[i].getWidth(); 
      int h = (int) dim.getHeight()+com[i].getHeight(); 
      dim.setSize(new Dimension(w,h)); 
     } 
     mainWorkingPane.setPreferredSize(dim); 
     mainWorkingPane.revalidate(); 
     revalidate(); 
     repaint(); 
    } 
} 

Pomysł jest owinąć JDesktopPane w JScrollPane, dodać detektor zmiany rozmiaru na ramie głównej, a następnie oceniać zawartość JDesktopPane na zmiany rozmiaru (lub dodanie nowych elementów).

Mam nadzieję, że to komuś pomaga.