Tabs bei JTabbedPane werden jedes neu ausgeführt

Status
Nicht offen für weitere Antworten.

kaneb

Mitglied
Hallo

Ich hab ein folgendes Problem. Ich hab ein Frame mit 4 verschiedene Tabs erstellt

Code:
public class RunProg extends JFrame {
	

	public RunProg(String titel){
		setVisible(true);
		setTitle(titel);
		setPreferredSize(new Dimension(1000,700));
		JTabbedPane jTabbedPane = new javax.swing.JTabbedPane();

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        
        jTabbedPane.add("Random Sorted Array", new QuickSortPlots(CreateArray.createRandomSortedArray(500)));
        jTabbedPane.add("Nearly Sorted Array", new  QuickSortPlots(CreateArray.createNearlySortedArray(500)));
        jTabbedPane.add("Reversed Sorted Array", new  QuickSortPlots(CreateArray.createReversedSortedArray(500)));
        jTabbedPane.add("Sorted Array", new  QuickSortPlots(CreateArray.createSortedArray(500)));
        


        getContentPane().add(jTabbedPane, BorderLayout.CENTER);

        pack();
	}
	
	public static void main(String[] arg){
		new RunProg("QuickSort");
	}	

}

wobei in jedem Tab Plots sind. die QuickSortPlots sieht so aus.


Code:
public class QuickSortPlots extends Container {
	
	int[] arr;
	long comp1,comp2,exch1,exch2,start,stop;
	
	public QuickSortPlots(int[] arr){
		this.arr=arr;
		setFocusable(false);
		comp1=0; comp2=0;
		exch1=0; exch2=0;
		start=0; stop=0;
	}
	public void paint(Graphics g){
		
		
		g.drawString("Werte", 10, 235);
		g.drawString("d. Arrays",1, 250);
		g.drawString(arr.length+"", 20, 40);
		g.drawString("A[i]", 60, 40);
		
		g.drawString("0",30,555);
		
		g.drawString("Laenge des Arrays", 230, 570);
		g.drawString(arr.length+"", 550, 570);
		g.drawString("i", 550, 540);
		
		//Point(50,400) is (0,0)
		g.drawLine(50, 50, 50, 550);
		g.drawLine(50, 550, 550, 550);
		int x=50; int y=550;
		
		double pointHelper = 500/arr.length;
		
		//paint unsorted array
		g.setColor(Color.RED);
		for(int i=0;i<arr.length;i++){
			int x1 = (int)(x+i*pointHelper);
			int y1 = (int)-((pointHelper*arr[i])-y);
			g.drawOval(x1, y1, 1, 1);
		}
		comp1=QuickSort.comparisons;
		exch1=QuickSort.exchanges;
		start = System.currentTimeMillis();
//		QuickSort quicksort= new QuickSort();
		QuickSort.quicksort(arr);
		stop = System.currentTimeMillis();
		comp2=QuickSort.comparisons;
		exch2=QuickSort.exchanges;
		
		double elapsed = stop-start;
		g.setColor(Color.BLUE);
		for(int i=0;i<arr.length;i++){
			int x1 = (int)(x+i*pointHelper);
			int y1 = (int)-((pointHelper*arr[i])-y);
			g.drawOval(x1, y1, 1, 1);
		}
		Font font = new Font(null,0,20);
		g.setFont(font);
		g.setColor(Color.DARK_GRAY);
		g.drawString("STATISTICS", 720, 50);
		g.setColor(Color.black);
		g.setFont(new Font(null,0,20));
		g.drawString("Time: "+elapsed+" nanosec.", 720, 80);
		g.drawString("Comparisons: "+(comp2-comp1), 720, 100);
		g.drawString("Exchanges: "+(exch2-exch1), 720, 120);		
		
		
		
	}

}

Also sowie ihr merken könnt, hier werden verschiedene Punkte erstellt, aber wenn ich von einem zu dem anderen Tab wechsele, und dann wieder zu dem vorherigen Tab wechsele, dann werde ich nicht vollständig das von paint() in bildschirm bekommen, und es wird noch mal der Objekt erstellt und aufgerufen(so meine ich mindestens, da ganz andere Punkte bekomme). Ich will nicht die Objekte nach jedem Wechsel von Tabs aufgerufen werden, und jedes Mal neue Punkte erstellen. Also, keine Änderungen mehr solange das Fenster nicht geschlossen ist. Ist es überhaupt möglich, oder vergesse ich noch 'was zu machen.

Danke im voraus
kaneb

edit: Das URL von JARDatei http://maloku.info/RunProg.jar
 
Man sollte nicht von Container erben, sondern von JComponent, und dort dann nicht die paint, sondern die paintComponent überschreiben
Code:
class QuickSortPlots extends JComponent
{
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        .... der ganze Rest....
    }
}
Allerdings ist es MEHR als häßlich, in der paint-Methode eine sortierfunktion aufzurufen und irgendwelche Zeitmessungen zu machen. Die paint(Component)-Methode ist NUR zum painten da, und wirklich NUR zum painten. Sonst hieße sie ja (running gag) nicht paintComponent, sondern paintComponentAndDoAllTheStuffOfWhichIDoNotKnowWhereToPutItBecuaseIAmTooLazyToReadATutorial.
 
Obwohl ja von Container in JComponent geändert habe, ist immer noch das gleiche. Trotzdem vielen Dank für deine Antwort

Allerdings ist es MEHR als häßlich, in der paint-Methode eine sortierfunktion aufzurufen und irgendwelche Zeitmessungen zu machen. Die paint(Component)-Methode ist NUR zum painten da, und wirklich NUR zum painten. Sonst hieße sie ja (running gag) nicht paintComponent, sondern paintComponentAndDoAllTheStuffOfWhichIDoNotKnowWhereToPutItBecuaseIAmTooLazyToReadATutorial.

Na dann, gib mir denn Tips, wie ich das anders machen könnte, du musst aber damit ausrechnen, dass ich noch ein Anfänger bin.

mfg
 
Hast du auch paint in paintComponent geändert, und super.paintComponent aufgerufen? Naja, selbst wenn, dann muss es nicht funktionieren: In deinem Beispiel wird ja bei jedem Neuzeichnen neu sortiert. Wenn nun zweimal neu gezeichnet wird (weil man z.B. das Fenster vergrößert oder verkleinert) dann kommt beim zweiten Neuzeichnen vermutlich(!) nur Mist raus.

Kannst vielleicht mal hier http://www.java-forum.org/de/viewtopic.php?t=67506&start=30 den letzten Beitrag angucken ... ist zwar auch nur schnell hingeschrieben, praktisch kommentarfrei, und in einigen Punkten... "ausbaufähig", aber verdeutlicht vielleicht EINE von vielen möglichen Herangehensweisen...

Wichtig ist in jedem Fall, dass das Sortieren usw. (also die eigentliche Funktionalität) unabhängig vom GUI ist. D.h. der Sortieralgoritmus (und die Berechnung der Statistik, die du da machst) sollte funktionieren - auch, wenn gar kein Frame offen ist. Das GUI dient NUR zum Anzeigen (und ggf. zum Empfangen von Benutzereingaben, die dann aber möglichst so an den "Programmkern" weitergereicht werden sollten, dass man nicht erkennt, dass sie von einem GUI stammen). D.h. das GUI holt sich einfach nur die Daten ab, und zeigt sie an. Und dieses Abholen kann dann in der paintComponent gemacht werden.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben