JPanal Aktualiserung

Hallo,

leider beschäftige ich mich seit 2 Tagen die ganze Zeit mit einem Problem. Ich komme nur leiter nicht weiter.
Ich habe einen JFrame in dem ein JPanel liegt. Wenn ich in dem Menü meines JFrames etwas ändere muss das zum Panel übermittelt werden. Dazu wäre eine aktualiserung/neu laden des Panels erforderlich da dieses einmalig beim Start des Jframes erzeugt wird.
In diesem Beispiel will ich eine Speicherpfadänderung für eine Datei, die ich im JFrame Menü ausführe, einfach an meinen JPanel übergeben und in dessen Funktion "private void TransformationButtonActionPerformed" ausgeben.
Dieses sind meine ersten Schritte in Jpanel und ich hoffe ihr könnt mir dabei helfen...Hier mein quellcode der beiden Funktionen ;):
Java:
class SimpleFrame extends JFrame 
{
	String savelocation = "C:\\Documents and Settings\\e914\\Desktop\\Testfiles\\";

	public SimpleFrame(Document doc)  
	{   			
		/////////////////////////////////////////////Frame Erzeugung/////////////////////////////////////////////////////////
	    SimplePanel panel = new SimplePanel(savelocation);  //Aktualiserung des JPanals ist nach der Änderung im Menü von jframe erforderlich aber wie?
		MenuBar mb = new MenuBar();
	    setMenuBar(mb);
	    Menu m = new Menu("Datei");
	    mb.add(m);
	    MenuItem neu = new MenuItem("Öffnen");
	    m.add(neu);
	    Menu sp = new Menu("Speicherpfad");
	    mb.add(sp);
	    MenuItem change = new MenuItem("Ändern");
	    sp.add(change);
    	
	    final Container cp = getContentPane();	     
	    cp.add(panel);							 
	   
	    	change.addActionListener(new ActionListener() {
	    		public void actionPerformed(ActionEvent evt) {
	    		savelocation = ChangeButtonActionPerformed(evt);
            	System.out.println("Speicherpfad neu: "+ savelocation);  // Speicherpfad wir hier neu gesetzt aber dem Panel, das zuerst erzeugt wird, nicht mitgeteilt.
            }
        });		
		setTitle("Swing-Frame"); 		
		setSize(1000, 500);    			
		setLocation(200,300); 			
	    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);			      
	}
	
    private String ChangeButtonActionPerformed(java.awt.event.ActionEvent evt) 
    {
    return "c:\\"; //Savelocation in Frame Funktion muss mit diesem wert überschrieben werden
    }
    
}

class SimplePanel extends JPanel       
{     
JLabel label;
JTable table;
JButton exitButton;
JButton transformation;

public SimplePanel( final String savelocation)
{     
			setLayout(null);
            exitButton = new JButton("Beenden");
            add(exitButton); 
            exitButton.setBounds(835,420,150,30);
            exitButton.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    exitButtonActionPerformed(evt);
                }
            });        
            transformation = new JButton ("Tickets erstellen");
            add(transformation); 
            transformation.setBounds(665,420,150,30);
        
            
            transformation.addActionListener(new ActionListener() {
	            public void actionPerformed(ActionEvent evt) {
	            	TransformationButtonActionPerformed(evt, savelocation);

	            }
	        });
                       
            add(label);   
}

private void TransformationButtonActionPerformed(java.awt.event.ActionEvent evt, String savelocation) 
{
	 System.out.println("Speicherpfad final: "+ savelocation); // Hier muss der neue Pfad ausgegeben werden.. er nimmt aber immer nur den alten von der ursprünglichen erzeugung
}
 
C

Camino

Gast
Kommt drauf an, was du in deinem JPanel drin hast und darstellen möchtest. Willst du in deinem JPanel etwas grafisch ändern, oder ändern sich nur die Daten, die dargestellt werden? Wenn nur Daten geändert werden, könntest du dafür ein Model erstellen, welches die Daten hat, und bei einer Änderung dann das JPanel aktualisiert.
 
Es sollen sich nur die Daten ändern.. also in diesem Fall der Speicherpfad. Dieser soll wenn ich auf meinen Jbutton "Tickets erstellen" drücke einfach an meine main übermittelt werden und diese speichert dann alles an benötigter Stelle ab.
Wie gesagt die Übermittlung und alles andere funtioniert problemlos. Nur das halt immrr der Ursprungspfad vom JPanel an dei main übertragen wird weil er den aktuellen aus dem Jframe nicht bekommt.
 
C

Camino

Gast
Du könntest in deinem JPanel eine Objektvariable für den Speicherpfad anlegen, in welcher die übergebene Stringvariable beim Erstellen des Panels gespeichert wird. Dann erstellst du getter- und setter-Methoden (public), mit denen du diese Variable auslesen oder ändern kannst. Aber wie gesagt, es ist oft besser, Daten (Model) und die Darstellung (View) voneinander zu trennen. Wird auf jeden Fall auch übersichtlicher, wenn deine Anwendung grösser wird.
 
Ich danke dir! Das mit den Setter und getter Methoden hat prima funktioniert!
Kannst du mir vll noch ein Besiiel dazu geben was du mit "Daten (Model) und die Darstellung (View) voneinander zu trennen" meinst?
 
C

Camino

Gast
Na ja, du hast eine Klasse, in der du die Daten hast (Model). Und eine Klasse, die für die Darstellung zuständig ist (View, GUI, also dein Panel). Dann ändern sich z.B. die Daten im Model und die Ansicht (Panel) wird aktualisiert, also die neuen Daten angezeigt.
 

hdi

Top Contributor
Code-Beispiel MVC:

Java:
interface DataModelListener{

    public void dataChanged(Object newData);
}

Java:
class DataModel{

    private Object someData;

    // ...

    private List<DataModelListener> listeners = new ArrayList<DataModelListener>();

    public void registerListener(DataModelListener l){
         listeners.add(l);
    }

    // ...
 
    public void setNewData(Object newData){
         someData = newData;
         for(DataModelListener l : listeners){
             l.dataChanged(newData);
         }
     }
}

Java:
class View extends JFrame implements DataModelListener{

     private DataModel model;

     private JLabel label;
     private JButton button;
     // ....

     public View(DataModel model){
          this.model = model;

          model.registerListener(this); // ------------ !
          // ...

      }

     // ...

     @Override
     public void dataChanged(Object newData){
           label.setText(newData.toString());
     }

     private void setupButton(){
           // ...
           button.addActionListener(new ActionListener(){
                 @Override 
                 public void actionPerformed(ActionEvent e){
                       model.setNewData(new String("Whatever..."));
                 }
            }
      }

Java:
class Start{

      public void main(String[] args){
 
            // setup data model
            DataModel model = new DataModel();
            model.setNewData(new String("Initial Data"));

            // connect model with view
            View view = new View(model);
            view.setVisible(true);
       }
}

Das ist das MVC-Pattern. Beim Klick auf den Button manipulierst du das Model. Über einen Callback aktualisiert sich das Label.
 

Oben