Bueno, creo que si pusieras algo de tu código ayudaría en la solución, pero básicamente yo lo implementaría así:
Clase 1 (Main): Crea un objeto de la clase2.
Clase2 (Ventana): Contiene un objeto de la clase3 para trabajar con los datos.
Clase3 (AdminDatos): Recibe llamadas de la clase2 y ejecuta, devolviendo valores a la clase2.
Un ejemplo sencillo, en pseudocódigo:
Código:
Main.java
-------------------
Ventana v = new Ventana();
v.setVisible(true);
Ventana.java
---------------------
class Ventana extends JFrame
int valor = 0;
AdminDatos dat = new AdminDatos();
JPanel p = new JPanel();
JButton boton = new JButton();
JLabel etiqueta = new JLabel();
boton.setActionListener(accion);
p.add(boton);
p.add(etiqueta);
this.add(p);
ActionListener accion = new ActionListener({
valor = dat.getOne();
etiqueta.setText(valor);
})
AdminDatos.java
--------------------------
public int getOne(){
return 1;
}
Básicamente con esto estamos creando un frame con un label y un botón, al pulsar el botón se le llama a la función que nos interesa de la clase AdminDatos y el resultado se coloca en el label. Yo utilizaría retorno de datos y me olvidaría de instanciar un objeto clase2 en la clase3, ya que esto no sigue las pautas de encapsulamiento.