Newsgroup: it.comp.java
Titolo: passare variabili da una sub sub classe alla classe main

ho un interfaccia relativamente complessa in cui diversi valori
presenti in JMenu devono essere letti quando premo un pulsante che usa
tali valori per avviare un processo che mi disegna in un JPanel in cui
il tasto e il JMenuBar sono stati aggiunti.
 
Ora siccome mi rende il codice piu' pulito mi piace avere i JMenu in
classi a parte che poi metto nella classe JMenuBar che inserisco nella
classe JFrame principale in cui a sua volta mettero' altri componenti
come il tasto di cui parlavo sopra e il JPanel con il PaintComponent.
 
per passare i valori da un JMenu al tasto in JFrame.. devo passare per
forza anche da JMenuBar... mi chiedevo se ci fosse una via meno
tortuosa per portare i valori da una classe che non e' direttamente
collegata alla classe in cui devo portare i valori.
 
ho scritto il seguente codice per essere piu chiaro... sfortunatamente
non riesco a capire l'errore che da in fase di esecuzione anche se
viene compilato correttamente:
 
 
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.io.IOException;
 
class doubleReturn {
	public static void main(String[] args){
		JFrame frame = new JFrame("..");
 
		SubClass1 menu = new SubClass1();
		frame.setJMenuBar(menu);
 
		frame.setLayout(new BorderLayout());
        // create swing component
        JPanelA jpanelA = new JPanelA();
		jpanelA.setClass1(menu);
        Chart chart = new Chart();
        jpanelA.setChart(chart);
 
        // add swing component
        frame.add(jpanelA, BorderLayout.NORTH);
        frame.add(chart, BorderLayout.CENTER);
 
		frame.setVisible(true);
		frame.setLocation(20,20);
		frame.setSize(400, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}
 
class JPanelA  extends JPanel {
     private Chart chart;
     private SubClass1 class1;
     public JPanelA() {
         JButton calculate = new JButton("DRAW");
         calculate.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent ae) {
					chart.setReturnedValue(class1.getClass2returnFrom1());
                    chart.repaint();
             }
         });
         add(calculate);
     }
     public void setChart(Chart chart) {
         this.chart = chart;
     }
	 public void setClass1(SubClass1 Class1) {
         this.class1 = class1;
     }
}
 
class Chart extends JPanel {
	String returned;
	public void setReturnedValue(String returned) {
		this.returned = returned;
	}
 
    public void paintComponent(Graphics g) {
		g.drawString("" + returned, 30, 30);
    }
}
 
class SubClass1 extends JMenuBar {
	String returned;
	SubClass2 class2 = new SubClass2("Class2");
 
	public SubClass1() {
		add(class2);
	}
 
	public String getClass2returnFrom1() {
		System.out.println("classe 1: " + class2.getClass2return());
		returned = class2.getClass2return();
		return returned;
	}
}
 
class SubClass2 extends JMenu{
	String c;
	JTextField valueField = new JTextField("54");
 
	public SubClass2(String title) {
		super(title);
		add(valueField);
	}
 
	public String getClass2return() {
		c = valueField.getText();
		return c;
	}
}
 
 
Mi basta capire se e' un modo corretto di procedere...
spero si capisca.. grazie per cercare di comprendere in ogni caso..
 
saluti!
 Sergio

 spero si capisca.. grazie per cercare di comprendere in ogni caso..
 
Questo codice comincia a essermi familiare :))
 
Hai una java.lang.NullPointerException per un banale errore di battitura 
qui:
 
Hai scritto:
public void setClass1(SubClass1 Class1) {
invece di scrivere
public void setClass1(SubClass1 class1) {
 
nota la maiuscola/minuscola nella iniziale di class1.
 
Questo provocava il fatto che il corpo della funzione assumeva il 
significato:
this.class1 = this.class1;
cioe' rimaneva "null", e da qui poi la NullPointerException.
 
Riguardo al modo di procedere va tutto bene.
L'unica cosa, immagino che per te i nomi "SubClass1", "SubClass2", 
"getClass2return" "getClass2returnFrom1" li hai messi solo per farti 
capire meglio, ma "da te" li chiami con nomi piu' espliciti.
In caso contrario ti sconsiglio di usare dei nomi cosi' "strani" ma 
dargli dei nomi che spieghino COSA fanno e non COME lo fanno.
 
Ciao.
 
 
 
 
 
 

 Riguardo al modo di procedere va tutto bene.
 
Dimenticavo, magari le avevi messe solo per debugging e poi le hai 
dimenticate, ma alcune variabili d'istanza (String), usate poi nelle 
funzioni, non avevano senso.
Inoltre metti sempre private alle variabili d'istanza se intanto poi le 
usi solo all'interno della classe, ti aiuta ad evitare errori.
 
Ti riscrivo Chart/SubClass1/SubClass2 in modo corretto (corretto per 
l'esempio che hai postato):
 
class Chart extends JPanel {
     private String returned;
     public void setReturnedValue(String returned) {
         this.returned = returned;
     }
     public void paintComponent(Graphics g) {
         // inoltre: se qualcuno usa male questa classe, qui returned 
potrebbe valere ancora "null", quindi metti un "if" o inizializza 
"returned" nel costruttore.
         g.drawString("" + returned, 30, 30);
     }
}
 
class SubClass1 extends JMenuBar {
     private SubClass2 class2;
     public SubClass1() {
         class2 = new SubClass2("Class2");
         add(class2);
     }
     public String getClass2returnFrom1() {
         return class2.getClass2return();
     }
}
 
class SubClass2 extends JMenu{
     private JTextField valueField;
     public SubClass2(String title) {
         super(title);
         valueField = new JTextField("54");
         add(valueField);
     }
     public String getClass2return() {
         return valueField.getText();
     }
}
 
Ciao.

Questo codice comincia a essermi familiare :))
 
ahah! si', santo coder!
se ho capito alcuni dei principi di Java lo devo a te.
 
grazie anche per i sonsigli riguardo a private e il resto..
se le cose non mi danno errore non capisco mai a cosa servono.
 
alla prossima!
 
 
 
 

 alla prossima!
 
eheh, mi diverto anch'io, e' un periodo di stanca...
Ciao.

 Mi basta capire se e' un modo corretto di procedere...
 
se non ho capito male questo tipo di problema si risolve, solitamente,
definendo le classi jmenu come interne o anonime nel jpanel.