Ciężkie poruszanie ScrollBar'a

0

Witam proszę o pomoc.
Piszę program który wczytuję plik wave i rysuje różne analizy sygnału. Stworzyłem m.in. scroll do pozycji , zoom i inne ale mam problem przy wczytywaniu większych plików a które tez powinny byc obsługiwane.
Problem jest w taki że mając bardzo dużą ilość wartości , scroll-e chodzą mi ciężko.
Zmiana wartości scrolla powoduje natychmiastowe (i prawidłowe) wywoływanie metod które przetwarzają dane dla posrednich/niechcianych przeze mnie wartości scrolla.
ActionListener nasłuchuje każdych zmian scrolla.
Np gdy scroll ma wartosci od 0 do 100 i np z pozycji 0 przesuwam do 50, Poruszanie scrollbara powoduje kolejne zmiany np 0,1,2,3,4 ... 49, 50 (nawet jesli nie są kolejne a np 0,5,12,20... 50) i tak to te pośrednie wartości powodują z kazdym razem uruchomienie przetwarzania które trwa dłuższą chwile.
I tu leży problem.
Niechce osiągać tu przyspieszenia przetworzenia danych a zwolnienia utrudnień przesuwania scrolla.
Metoda calculations() która przetwarza dane jest wywolywana nie tylko przez jednego scrolla ale takze przez butony i menu dlatego nie wiem jak i gdzie stworzyć ewentualny watek wrzucenia tych obliczeń w tło - jesli wtedy by to pomogło.
Proszę o pomoc.

class Main {
Display obiektDisplay = new Display();
 
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {  //Note 1
	        public void run() {
	    		Main obiekt = new Main();
	    		obiekt.initGUI();
	        }
		});
	 }
 
         initGUI() {
         JFrame frame = new JFrame();
          ...
         JScrollBar scrollPos = new JScrollBar(JScrollBar.HORIZONTAL);
         scrollPos.setVisibleAmount(0);
         ...
	 scrollPos.addAdjustmentListener(this);
	 ...
 
 
	public void adjustmentValueChanged(AdjustmentEvent evt) {
		if (evt.getSource() == scrollPos) {
			obiektDisplay.setScrollPos(evt.getValue()); 
		}
}
 
class Display extends JPanel {
...
	public void setScrollPos(int value){
		this.pos = value;
		calculations();
	}
...
}


0

Hm... może dziwne, ale warto wrzucić do cacha raz przetworzony sygnał. W takiej sytuacji przynajmniej część danych będzie wczytywana szybciej. Co zaś tyczy się samego wątku obliczeń to można go wrzucić gdziekolwiek (najlepiej jako osobny modulik) i przed wywołaniem sprawdzać czy przez przypadek już nie śmiga. Wątki można nazywać "po ludzku" przez setName(String) bodajże. Następnie sprawdzasz czy nie istnieje wątek o podanym name i tyle. Jak jest to go już nie ruszasz lub czytasz cache.

0

Moglbys dac jakiegos linka albo przyklad ktory pokazuje jak umiescic watek gdzies w klasie? Czytalem duzo juz o watkach na stronie Sun'a ale nie bardzo rozumiem. Znam jedynie możliwosc uruchomienia tylko watku dla calej klasy:

class Main{
...
Thread watekDisplay = new Thread(obiektKlasyDisplay);
watekDisplay.start();
}

class Display {
	public void run() {
		pracuj();
		try { join(); } 
		catch (Exception ex) { ex.printStackTrace(); }	
	}

Włozenie metody run() gdzies w konkretnym miejscu w metodzie nie wychodzi dlatego nie wiem jak wrzucic watek gdziekolwiek - tak aby sie rozpoczal. Bo samo stworzenie jw. jest jasne. Prosze Cie o jakis przyklad jesli mozesz i jak sie da to też tak jak mowiles ze sprawdzeniem czy przypadkiem watek jest uruchomiony.

1 użytkowników online, w tym zalogowanych: 0, gości: 1