Daten zwischen Child-JFrame und Parent-JFrame austauschen

erazor2106

Bekanntes Mitglied
Hallo,

undzwar habe ich 2 eigenständige Programme, also jedes mit einer eigenen Main-Methode. Eines von beiden wird zum Hauptprogramm gemacht und kann per Druck auf einen Button das andere Programm starten, also es sind dann 2 JFrames geöffnet.

Wie kann ich es jetzt bewerkstelligen das die Werte welche in dem "Unterprogramm" erzeugt werden und in Arrays abgelegt werden vom Hauptprogramm aus verwendet werden können, also das eine direkte Interaktion stattfindet?

Beim Zugriff auf das JFrame kommt immer nur die Meldung "non-static variable x cannot be referrenced from a static context"

ich hoffe ihr könnt mir da helfen und die frage ist nicht allzu peinlich 🙂
 
Hm, ich versteh nicht so ganz was du machen willst. Wenn du zwei eigenständige Programm hast, dann kannst du die Kommunikation z.b. über Sockets regeln.

Aber deine Fehlermeldung hört sich nach was ganz anderem an 🙂

non-static variable x cannot be referrenced from a static context
Das heißt einfach nur dass du versuchst aus einem statischen Kontext (z.b. aus der main) auf ne instanzvariable zugreifen willst. Das klappt so nicht, dafür musst du zuerst ein Objekt erstellen.

Aber poste doch vllt mal etwas code der zeigt was du machen willst.
 
Du kannst es entweder machen in dem du Referenzen auf den jeweils anderen Frame übergibst oder indem du ein gemeinsames Datenmodel benutzt. Aus MVC Gründen solltest du eh keine Daten direkt in der GUI halten sondern über einen Controller auf ein Datenmodel zugreifen.

Das Datenmodell könntest du ganz einfach über z.B. das Singleton Pattern lösen. Da streiten sich gleich wieder alle ob das die beste Lösung ist oder nur crap - aber es funktioniert jedenfalls. Sonst halt über Dependency Injection 😉

Beispiel: (Vorsicht - wirklich nur Beispielcode, kein Controller, crappy GUI code etc...)

Java:
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class JFrameA extends JFrame{

	public JFrameA(){
		// add some values to the data model:
		DataModel.getInstance().setValues(new String[]{"1","2","3"});
		
		JPanel panel = new JPanel();
		
		JButton button = new JButton("Start B");
		panel.add(button);
		button.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				JFrameB.main(null);	
			}
		});
		JButton button2 = new JButton("Print Values");
		panel.add(button2);
		button2.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println(Arrays.toString(DataModel.getInstance().getValues()));	
			}
		});
		
		this.add(panel);
		this.pack();
	}
	
	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		JFrameA a = new JFrameA();
		a.setSize(new Dimension(100,100));
		a.setVisible(true);
	}

}

Java:
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class JFrameB extends JFrame{

	public JFrameB(){
		// add some values to the data model:
		DataModel.getInstance().setValues(new String[]{"4","5","6"});
		
		JPanel panel = new JPanel();
		
		JButton button = new JButton("Start A");
		panel.add(button);
		button.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				JFrameA.main(null);	
			}
		});
		JButton button2 = new JButton("Print Values");
		panel.add(button2);
		button2.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println(Arrays.toString(DataModel.getInstance().getValues()));	
			}
		});
		
		this.add(panel);
		this.pack();
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		JFrameB a = new JFrameB();
		a.setSize(new Dimension(100,100));
		a.setVisible(true);
	}
}

Java:
public class DataModel {

	private static DataModel instance;
	
	private String[] values;
	
	private DataModel(){
		//supress public constructor
	}
	
	public static DataModel getInstance(){
		if(instance == null){
			instance = new DataModel();
		}
		return instance;
	}

	/**
	 * @return the values
	 */
	public String[] getValues() {
		return values;
	}

	/**
	 * @param values the values to set
	 */
	public void setValues(String[] values) {
		this.values = values;
	}
	
}
 

Zurück
Oben