problem z repaint

problem z repaint
L8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

od razu chcę powiedzieć że nie jestem mistrzem w tym języku więc liczę na cierpliwość i wyrozumiałość. Problem polega na tym że muszę napisać program który graficznie przedstawi parę prostych algorytmów. Problem jest w tym że obiekty rysują się dopiero pod koniec programu. Zamieszczam kod:

#tu wstawię nowy efekt#
a i jest jeszcze jeden problem. 3 przyciski pojawiają się dopiero po najechaniu na nie. w czym może być problem?

Black007
  • Rejestracja: dni
  • Ostatnio: dni
0

A w metodzie main używasz może wątku swinga do tworzenia tego okna?
Np:

Kopiuj
SwingUtilities.invokeLater(new Runnable() {
			
			@Override
			public void run() {
				MainWindow window = new MainWindow();
				window.setVisible(true);
				
			}
		}); 
L8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

public static void main(String args[]){
Okno okno=new Okno();
}

jak widzisz niestety nie. A co by to zmieniło?

L8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

zamieszczam najnowsza wersje programu. w tej chwili poprawnie działa tylko przy długości ciągu 100. W obu wersjach i wszystkie algorytmy sortowania działają. Nadal problem z rysowaniem. Pomóżcie proszę.
kod w linku:

#tu wstawię nowy efekt#

Black007
  • Rejestracja: dni
  • Ostatnio: dni
0

Spróbuj to zrobić po mojemu.
Chodzi o to, że tworzenie/dodawanie kontrolek/okien musi być obsługiwane w Kolejce Swing, przy pomocy tego fragmentu który Ci napisałem.
W przeciwnym razie będziesz miał takie klocki, jak znikające przyciski itp. itd.

L8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

dzieki :)

L8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

niestety nie poprawiło to sytuacji. Co do wątków czy jest możliwość, żeby zatrzymać na chwilę aplikację, aby w innej klasie coś wydrukował?

OG
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 14
0
Kopiuj
class Panel extends JPanel {
int a[];
int b;
Graphics g;
public void paintComponent(Graphics g) {
	if (a != null)
	{
		int i;
		for(i=0;i<100;i++)
		{
			g.drawLine(b*(3*i+10),b*100,b*(3*i+10),b*(2*a[i]+100));
		
		}
	}
}

Musisz pamiętać, że nie można używać czegoś czego nie ma. Początkowo tablica a jest null ;].

L8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

zauważyłem już to :) i masz rację. teraz jest problem w tym tylko że kresek nie rysuje na bieżąco. uporządkuję kod i prześlę raz jeszcze :)

L8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

albo prześlę tak jak mam. #miejsce#

OG
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 14
0

W klasie Panel wywołujesz swoją funkcję paintComponent z g (Graphics), którego nie inicjujesz. Możesz przed wywołaniem

Kopiuj
paintComponent(g, dane);

dać

Kopiuj
g = this.getGraphics();

albo w ogóle zrezygnować z tego parametru i pobierać go w tej funkcji.

  • Rejestracja: dni
  • Ostatnio: dni
0

Imho, masz złą organizację klasy Panel. Tablica int[] dane jest polem w tej klasie, zatem jest widoczna w każdej metodzie i nie ma potrzeby jej przekazywać.
Powinno być

Kopiuj
   public void paintComponent(Graphics g)
   {
     ...
   }

Samodzielne wywoływanie metody paintComponent() jest złym rozwiązaniem, należy wywołać repaint(), a paintComponent(Graphics g) w magiczny sposób samo się wykona.

L8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

czy wtedy narysuje mi te linie?

L8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

@bo
już to poprawiłem, zaraz sprawdzę jak działa i będziemy dalej myśleć.

L8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

jest nieźle. Teraz muszę odpowiednio to uporządkować. Będę pytał jakby co.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.