# Dynamisch Komponenten in einem JPanel bzw JFram austauschen



## Gast (31. Jan 2008)

Hallo

kann man zur Laufzeit Komponenten austauschen?

Ich habe verschiedene Messwerte aus verschiedenen Dateien.
Diese Messwerte stehen in den Dateien als Blöcke und so sollen sie auch wieder dargestellt werden.
Aus den Daten wird mit JFreeChart ein Chart Array erzeugt, pro Block eins.

Angenommen ich lese aus einer Datei zwei Blöcke aus erstelle ich also 2 Charts und schreibe die in ein Array
Nun zeig ich noch die Messdaten in einem JTable in einer TabbedPane an, pro Tab ein Block.

Wenn ich nun das Tab wechsel möchte ich das auch das entsprechende Chart angezeigt wird.

Und genau da ist mein Problem ich weiß nicht wie, hab schon versucht mit remove() die entsprechende Komponenten zu entfernen und neu erzeugte zu setzen aber bringt nichts.

Hier mein Code:

```
public class WorkbenchSample extends JFrame 
{
	/**
	 * 
	 */
	private static final long serialVersionUID = -1397645983376696508L;
	private JTable table[];
	private JTabbedPane tabPane;
	private JScrollPane scroll1, scroll2;
	private JPanel mainPanel;
	private String messTitel = "Messreihe ";
	private String tLabels[] = {"Batterie1", "Batterie2", "Batterie3" };
	private JComboBox comboBox;
	private JButton ok = new JButton("OK");
	private JPanel pan; 
	private CellConstraints cc;
	private FormLayout layout;
	private ChartPanel chartPanel;
	private JFreeChart[] chartArray;
	
	public WorkbenchSample(Connector con) 
	{
		super("WorkbenchSample");
	
		ok.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent arg0) {
				generateGuiComponents(((Messreihe)comboBox.getSelectedItem()).getDdlist(), false);
				System.out.println(((Messreihe)comboBox.getSelectedItem()).getPath());
			}		
		});
		
		layout = new FormLayout("4dlu,pref,2dlu,pref,4dlu","4dlu,pref,2dlu,pref,2dlu,pref,4dlu");
		cc = new CellConstraints();
		
		comboBox = new JComboBox(con.getAll());
		mainPanel = new JPanel(layout);

		pan = new JPanel(new FormLayout("pref,2dlu,pref","pref"));
		pan.add(comboBox, cc.xy(1, 1));
		pan.add(ok, cc.xy(3, 1));
		
		generateGuiComponents(con.getAll()[0].getDdlist(), true);

		mainPanel.add(pan, cc.xy(2, 4));

		add(mainPanel);
		
		
		addWindowListener(new WindowClosingAdapter());
		setVisible(true);
		pack();
	}
	
	/**
	 * Generiert die Componenten fügt sie aber noch nicht hinzu
	 * */
	
	private void generateGuiComponents(LinkedList<Double[][]> ddlist, boolean firstTime)
	{
		int count = 0;
		tabPane = new JTabbedPane();
		Iterator<Double[][]> ddIter = ddlist.iterator();
		chartArray = new JFreeChart[ddlist.size()];
		table = new JTable[ddlist.size()];
		Double[][] tmp = null;
		
		while(ddIter.hasNext())
		{
			tmp = ddIter.next();
			table[count] = new JTable(tmp, tLabels);
			table[count].setAutoscrolls(true);
			tabPane.addTab(messTitel + (count+1),table[count]);
			
			chartArray[count] = ChartFactory.createLineChart("SampleChart", "Messreihe Sample", "Volt", DatasetUtilities.createCategoryDataset("Reihe", "Messpunkt", tmp), PlotOrientation.VERTICAL, true, true, true);
			count++;
		}
		
		//HIER IST DAS PROBLEM Das nächste Chart wird nicht gesetzt
		tabPane.addChangeListener(new ChangeListener(){

			@Override
			public void stateChanged(ChangeEvent e) 
			{
				chartPanel = new ChartPanel(chartArray[tabPane.getSelectedIndex()]);
			}
			
		});
		if(firstTime)
			chartPanel = new ChartPanel(chartArray[0]);
		
		scroll1 = new JScrollPane(chartPanel);
		scroll2 = new JScrollPane(tabPane);
		
		mainPanel.add(scroll1, cc.xy(2, 2));
		mainPanel.add(scroll2, cc.xy(2, 6));
                this.repaint();
	}
```

Noch ein Screenshot um sich das ganze besser vorstellen zu können





Ich hoffe ich habe mich deutlich ausgedrückt das fällt mir manchmal nämlich schwer   

Peace


----------



## Wildcard (31. Jan 2008)

http://java.sun.com/docs/books/tutorial/uiswing/layout/card.html


----------



## Guest (31. Jan 2008)

Danke, nach sowas habe ich jetzt zwei Tage gesucht  :applaus: 

Das löst aber mein Problem noch nicht ganz. Wenn ich nun die Datei mit den Messwerten wechsle muss ich mir vollkommen neue Komponenten erstellen und das geht wohl nicht, nach einem repaint wird gar kein Chart mehr angezeigt und der JTable verändert sich nicht.

Für so eine tolle Lösung wie die mit dem Tutorial wäre ich sehr dankbar

Peace


----------



## Wildcard (31. Jan 2008)

Wenn du dynamisch Components hinzufügst musst du revalidate auf dem Container aufrufen.


----------



## Guest (31. Jan 2008)

ich hab das mal so probiert




```
private void generateGuiComponents(LinkedList<Double[][]> ddlist, boolean firstTime)
	{
		int count = 0;
		tabPane = new JTabbedPane();
		cards = new JPanel(new CardLayout());
		Iterator<Double[][]> ddIter = ddlist.iterator();
		Double[][] tmp = null;
		
		while(ddIter.hasNext())
		{
			tmp = ddIter.next();
			tabPane.addTab(messTitel + (count+1), new JTable(tmp, tLabels));
			cards.add(new ChartPanel(ChartFactory.createLineChart("SampleChart", "Messreihe Sample", "Volt", DatasetUtilities.createCategoryDataset("Reihe", "Messpunkt", tmp), PlotOrientation.VERTICAL, true, true, true)),""+count);
			count++;
		}
	
		tabPane.addChangeListener(new ChangeListener(){

			@Override
			public void stateChanged(ChangeEvent e) 
			{
				CardLayout cl = (CardLayout)cards.getLayout();
				cl.show(cards, "" + tabPane.getSelectedIndex());
			}	
		});
		
		scroll1 = new JScrollPane(cards);
		scroll2 = new JScrollPane(tabPane);
		
		mainPanel.add(scroll1, cc.xy(2, 2));
		mainPanel.add(scroll2, cc.xy(2, 6));
		
		cards.revalidate();
		tabPane.revalidate();
		scroll1.revalidate();
		scroll2.revalidate();
		mainPanel.revalidate();
		
		this.repaint();
	}
```

also alles revalidiert und dann ein repaint aber leider ändert sich da garnichts bzw. schon der ChangeListener funktioniert nicht mehr


----------



## Wolfgang Lenhard (1. Feb 2008)

Das Problem hatte ich auch bereits öfters, ohne dass ich weiß, wo eigentlich der Fehler liegt. Als Workaround funktioniert meistens, die Komponente zuerst setVisible(false) und dann wieder true zu setzen. Probiers mal, vielleicht hilft es ja.


----------



## Foermchen82 (1. Feb 2008)

Danke. Revalidate hat mir noch gefehlt.


----------



## Guest (1. Feb 2008)

Kannst du mir mal ein Beispiel geben mit dem setVisible(false) und revalidate wo und wann ich das machen muss. Nach dem erzeugen? Nach dem adden? Muss ich überhaupt neu adden?


----------

