Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Newbies : Appli Java

9 réponses
Avatar
synopsis
Bonjour à tous,

Je suis un débutant en Java, votre aide me sera précieuse.

Je souhaite développer une application simple de gestion de base de données,
sur un mySql distant.

Pour cela, j'ai télécharger et installer l'environnemement de développement
NetBeans IDE 5.0.


L'IHM est standard :
- une fenêtre Application Principale + son menu

Dans le menu : Fichier > Connexion
Ouvre une une fenêtre avec les composants suivants :
- champs de saisie : URL
- champs de saisie : LOGIN
- champs de saisie : PASSWORD
- Bouton Connexion
- Bouton ANNULER


// Lorsque je ferme ma Frame Connexion, je perd mon objet Connexion.
// Si je déclare l'objet Connexion dans ma frame principale, elle n'est pas
visible dans frame Connexion (le compilateur bug)
même en passant par un

public void Connect(String url, String login, String password) {
..
}

Ou et comment créer un objet connexion (java.sql.connection) GLOBAL ?
C'est objet doit-être visible de partout dans l'application, par toute les
classes.

Pour démarrer, je souhaite ne créer qu'un seul objet Connexion.
Dans l'avenir, il sera possible de se connecter simultanénement (instancier)
plusieurs connexions.

Merci.

Cordialement,

9 réponses

Avatar
Xavier Tarrago
Je ne connais pas l'objet Connexion et je ne commente donc pas son
utilisation. Ce qui suit concerne le partage d'objets et leur durée de vie.

Un objet dure aussi longtemps qu'une référence pointe dessus. Si la
connexion doit durer pendant toute l'application, il doit y avoir une
référence qui dure aussi longtemps. Le bon endroit est effectivement la
frame principale de l'application. Elle doit etre dans un membre privé de la
classe (règle de programmation). Pour qu'elle soit visible depuis d'autres
frames, il faut soit passer cette connection au constructeur de l'autre
frame, soit que l'autre frame ait une référence sur la frame principale et
que la frame principale ait une méthode getConnexion() (ou getConnexion(int
index) si il y en a plusieurs) qui retourne la (ou une) connexion.

J'espère ne pas avoir été hors sujet.

"synopsis" a écrit dans le message de
news:44888bdc$0$10989$
// Lorsque je ferme ma Frame Connexion, je perd mon objet Connexion.
// Si je déclare l'objet Connexion dans ma frame principale, elle n'est
pas

visible dans frame Connexion (le compilateur bug)
même en passant par un

public void Connect(String url, String login, String password) {
..
}

Ou et comment créer un objet connexion (java.sql.connection) GLOBAL ?
C'est objet doit-être visible de partout dans l'application, par toute les
classes.

Pour démarrer, je souhaite ne créer qu'un seul objet Connexion.
Dans l'avenir, il sera possible de se connecter simultanénement
(instancier)

plusieurs connexions.

Merci.

Cordialement,











Avatar
said.rabie
synopsis wrote:
Bonjour à tous,

Je suis un débutant en Java, votre aide me sera précieuse.

Je souhaite développer une application simple de gestion de base de don nées,
sur un mySql distant.

Pour cela, j'ai télécharger et installer l'environnemement de dével oppement
NetBeans IDE 5.0.


L'IHM est standard :
- une fenêtre Application Principale + son menu

Dans le menu : Fichier > Connexion
Ouvre une une fenêtre avec les composants suivants :
- champs de saisie : URL
- champs de saisie : LOGIN
- champs de saisie : PASSWORD
- Bouton Connexion
- Bouton ANNULER


// Lorsque je ferme ma Frame Connexion, je perd mon objet Connexion.
// Si je déclare l'objet Connexion dans ma frame principale, elle n'est pas
visible dans frame Connexion (le compilateur bug)
même en passant par un

public void Connect(String url, String login, String password) {
..
}

Ou et comment créer un objet connexion (java.sql.connection) GLOBAL ?
C'est objet doit-être visible de partout dans l'application, par toute les
classes.

Pour démarrer, je souhaite ne créer qu'un seul objet Connexion.
Dans l'avenir, il sera possible de se connecter simultanénement (instan cier)
plusieurs connexions.

Merci.

Cordialement,



Bonjour,

si j'ai bien compris tu as besoin d'une variable global. :)

Les variable global n'existe pas en java.

soulution = singleton :)


class Connexion {

private satic Connection connextion = null;
/**
autre variable
*/


private Connextion() { } // conctructeur privé (important)

public static Connexion getinstance() {

if(connexion == null)
connexion = new Connexion();
return Connexion();

}

}


apres tu pourra obtenir ton objet connexion la ou tu veux on appelant
la methode static de la class Connexion


Connextion myConnexion = Connexion.getInstance();


Saïd.

Avatar
synopsis
Merci pour votre aide.

J'ai décidé de passer l'object connection "Conn" de la frame principale
"FrmMain" au constructeur de la frame connection "FrmCnx"

Je rencontre à ce niveau un autre problème.

Comme l'objet "Conn" n'est pas instancié, cette méthode ne marche.

Pour instancier l'objet, je dois monter ma connexion (
DriverManager.getConnection(url, login, password))
Les paramètres de connexion ne sont connu que dans FrmCnx.

private void MnuConnectActionPerformed(java.awt.event.ActionEvent evt) {
java.sql.Connection Conn;
new FrmCnx(Conn).setVisible(true);
}


Comment contourner ce problème ?




"Xavier Tarrago" a écrit dans le message
de news: e6b86j$b09$
Je ne connais pas l'objet Connexion et je ne commente donc pas son
utilisation. Ce qui suit concerne le partage d'objets et leur durée de
vie.

Un objet dure aussi longtemps qu'une référence pointe dessus. Si la
connexion doit durer pendant toute l'application, il doit y avoir une
référence qui dure aussi longtemps. Le bon endroit est effectivement la
frame principale de l'application. Elle doit etre dans un membre privé de
la
classe (règle de programmation). Pour qu'elle soit visible depuis d'autres
frames, il faut soit passer cette connection au constructeur de l'autre
frame, soit que l'autre frame ait une référence sur la frame principale et
que la frame principale ait une méthode getConnexion() (ou
getConnexion(int
index) si il y en a plusieurs) qui retourne la (ou une) connexion.

J'espère ne pas avoir été hors sujet.

"synopsis" a écrit dans le message de
news:44888bdc$0$10989$
// Lorsque je ferme ma Frame Connexion, je perd mon objet Connexion.
// Si je déclare l'objet Connexion dans ma frame principale, elle n'est
pas

visible dans frame Connexion (le compilateur bug)
même en passant par un

public void Connect(String url, String login, String password) {
..
}

Ou et comment créer un objet connexion (java.sql.connection) GLOBAL ?
C'est objet doit-être visible de partout dans l'application, par toute
les
classes.

Pour démarrer, je souhaite ne créer qu'un seul objet Connexion.
Dans l'avenir, il sera possible de se connecter simultanénement
(instancier)

plusieurs connexions.

Merci.

Cordialement,















Avatar
Raphael Tagliani
Ta connexion ne devrait pas dépendre de ta GUI.
Pour éviter tes problèmes, tu peux faire, par exemple une classe
DBConnection (Singleton, constructeur privé), avec une méthode statique
getConnection() (qui instancie une DBConnection la première fois, puis
retourne la connexion).

Puis:
1) ton programme se lance

1.1) tu lances l'interface graphique avec un bouton établir connexion
XOR
1.2) tu crée la connexion lorsque le prog se lance

2) Une fois la connexion établie, tu peux l'avoir où tu veux en faisant:
DBConnection.getConnection()

Fais bien attention aux exceptions.

En passant, un meilleur titre pour le sujet aurait été
"java.sql.Connection" ou quelque chose de moins général que 'Appli Java'.

synopsis wrote:
Merci pour votre aide.

J'ai décidé de passer l'object connection "Conn" de la frame principale
"FrmMain" au constructeur de la frame connection "FrmCnx"

Je rencontre à ce niveau un autre problème.

Comme l'objet "Conn" n'est pas instancié, cette méthode ne marche.

Pour instancier l'objet, je dois monter ma connexion (
DriverManager.getConnection(url, login, password))
Les paramètres de connexion ne sont connu que dans FrmCnx.

private void MnuConnectActionPerformed(java.awt.event.ActionEvent evt) {
java.sql.Connection Conn;
new FrmCnx(Conn).setVisible(true);
}


Comment contourner ce problème ?




"Xavier Tarrago" a écrit dans le message
de news: e6b86j$b09$

Je ne connais pas l'objet Connexion et je ne commente donc pas son
utilisation. Ce qui suit concerne le partage d'objets et leur durée de
vie.

Un objet dure aussi longtemps qu'une référence pointe dessus. Si la
connexion doit durer pendant toute l'application, il doit y avoir une
référence qui dure aussi longtemps. Le bon endroit est effectivement la
frame principale de l'application. Elle doit etre dans un membre privé de
la
classe (règle de programmation). Pour qu'elle soit visible depuis d'autres
frames, il faut soit passer cette connection au constructeur de l'autre
frame, soit que l'autre frame ait une référence sur la frame principale et
que la frame principale ait une méthode getConnexion() (ou
getConnexion(int
index) si il y en a plusieurs) qui retourne la (ou une) connexion.

J'espère ne pas avoir été hors sujet.

"synopsis" a écrit dans le message de
news:44888bdc$0$10989$

// Lorsque je ferme ma Frame Connexion, je perd mon objet Connexion.
// Si je déclare l'objet Connexion dans ma frame principale, elle n'est


pas

visible dans frame Connexion (le compilateur bug)
même en passant par un

public void Connect(String url, String login, String password) {
..
}

Ou et comment créer un objet connexion (java.sql.connection) GLOBAL ?
C'est objet doit-être visible de partout dans l'application, par toute
les
classes.

Pour démarrer, je souhaite ne créer qu'un seul objet Connexion.
Dans l'avenir, il sera possible de se connecter simultanénement


(instancier)

plusieurs connexions.

Merci.

Cordialement,



















Avatar
Pierre Maurette
Merci pour votre aide.

J'ai décidé de passer l'object connection "Conn" de la frame principale
"FrmMain" au constructeur de la frame connection "FrmCnx"

Je rencontre à ce niveau un autre problème.
[...]


Je suis vos messages et me décide à intervenir, bien que moi-même
débutant. Il se trouve que je suis en plein dans les BdD.
Vous avez de toute évidence un problème de conception puisque ce que
vous voulez faire est classique.
Personnellement j'ai lu cette page:
http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javadb/index.html
J'ai chargé l'exemple, et l'ai repris sans problème sous JBuilder. Puis
adapté à Derby et commencé à modifier des trucs pour utiliser dbUtils.
Ce devrait être encore plus simple pour vous qui êtes sous NetBeans.

Créer une classe qui encapsule toute la tuyauterie au contact de la
base de données semble une bonne idée. Appelez-la connectDAO, comme
Data Access Object, expliqué dans le lien. Personnellement, j'ai repris
ce principe, mais pas nécessairement le design pattern DAO dans toute
sa pureté.
Vous créez dans les inits (par exemple de la fenêtre principale de
l'appli si elle est GUI) une instance de ConnectDAO, peut-être avec un
objetc Connection à null. Par new ConnectDAO() dans le cas d'une classe
normale, par getInstance() dans le cas d'un singleton. Il faut que
toutes les classes utilisatrices connaissent cette instance. Dans le
premier cas, il faudra la transmettre en paramètre aux constructeurs,
ou écrire un getter dans la classe détentrice de l'instance. Un
sigleton sera mieux en général, vous faites un ConnectDAO.getInstance()
là où vous en avez besoin.
La classe ConnectDAO doit être assez complète, elle doit par exemple
pouvoir fournir des renseignements sur son état, en particulier sa
private de type Connection. Vous devrez écrire une:
Connect(String url, String user, String password)
que vous appellerez à partir de votre FrmCnx. Il doit également être
possible d'encapsuler FrmCnx dans ConnectDAO. Dans votre gestionnaire
d'évènement de FrmMain, vous faites un truc genre
ConnectDAO.newConnexionByHand()
Je ne pense pas que ça puisse poser des problèmes par exemple de
modalité, mais je n'en suis pas tout à fait certain.

Je termine par le problème singleton / pas singleton. Même une base
contenant de nombreuses tables n'aura qu'un objet Connection. Et le
singleton amène beucoup d'avantages. On va donc au départ traiter la
classe ConnectDAO comme un singleton. Ensuite, vous pouvez aller dans
deux directions:
- soit vous avez besoin d'une ou plusieurs autres bases de structures
différentes. Vous créer alors d'autres singletons. Par exemple, vous
aurez GestCommDAO et GestPersonnelDAO, qui peuvent dériver d'une classe
abstraite ConnectDAO.
- Soit vous voulez sur le même modèle (paramétrable éventuellement)
créer (ou vous connecter sur) en dynamique des bases. Il y a
certainement là des techniques que j'ignore encore, mais vous pouvez
toujours faire un singleton ConnectionsDAO, qui va encapsuler et
maintenir une Collection de ConnectDAO. Dans votre FrmCnx, vous aurez
par exemple:
AddConnection(String url, String user, String password)

--
Pierre Maurette

Avatar
synopsis
Merci beaucoup.

A terme, je pense évoluer vers une classe effectivement assez complète de
type DAO avec GUI.

Je pense avoir cerner un peu mon pb actuel.

Je passe maintenant la connexion dans le constructeur de la FrmCnx.
Les variables sont passées en Java, me semble-t'il en valeur, et non en
référence.
Mon object Connexion de ma FrmCnx ne pointe pas sur l'object Connexion de ma
FrmMain.
L'initialisation n'a lieu que dans ma FrmCnx.

Comment retourner l'object Connexion ?




A terme, je pense
"Pierre Maurette" a écrit dans le message de
news:
Merci pour votre aide.

J'ai décidé de passer l'object connection "Conn" de la frame principale
"FrmMain" au constructeur de la frame connection "FrmCnx"

Je rencontre à ce niveau un autre problème.
[...]


Je suis vos messages et me décide à intervenir, bien que moi-même
débutant. Il se trouve que je suis en plein dans les BdD.
Vous avez de toute évidence un problème de conception puisque ce que vous
voulez faire est classique.
Personnellement j'ai lu cette page:
http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javadb/index.html
J'ai chargé l'exemple, et l'ai repris sans problème sous JBuilder. Puis
adapté à Derby et commencé à modifier des trucs pour utiliser dbUtils. Ce
devrait être encore plus simple pour vous qui êtes sous NetBeans.

Créer une classe qui encapsule toute la tuyauterie au contact de la base
de données semble une bonne idée. Appelez-la connectDAO, comme Data Access
Object, expliqué dans le lien. Personnellement, j'ai repris ce principe,
mais pas nécessairement le design pattern DAO dans toute sa pureté.
Vous créez dans les inits (par exemple de la fenêtre principale de l'appli
si elle est GUI) une instance de ConnectDAO, peut-être avec un objetc
Connection à null. Par new ConnectDAO() dans le cas d'une classe normale,
par getInstance() dans le cas d'un singleton. Il faut que toutes les
classes utilisatrices connaissent cette instance. Dans le premier cas, il
faudra la transmettre en paramètre aux constructeurs, ou écrire un getter
dans la classe détentrice de l'instance. Un sigleton sera mieux en
général, vous faites un ConnectDAO.getInstance() là où vous en avez
besoin.
La classe ConnectDAO doit être assez complète, elle doit par exemple
pouvoir fournir des renseignements sur son état, en particulier sa private
de type Connection. Vous devrez écrire une:
Connect(String url, String user, String password)
que vous appellerez à partir de votre FrmCnx. Il doit également être
possible d'encapsuler FrmCnx dans ConnectDAO. Dans votre gestionnaire
d'évènement de FrmMain, vous faites un truc genre
ConnectDAO.newConnexionByHand()
Je ne pense pas que ça puisse poser des problèmes par exemple de modalité,
mais je n'en suis pas tout à fait certain.

Je termine par le problème singleton / pas singleton. Même une base
contenant de nombreuses tables n'aura qu'un objet Connection. Et le
singleton amène beucoup d'avantages. On va donc au départ traiter la
classe ConnectDAO comme un singleton. Ensuite, vous pouvez aller dans deux
directions:
- soit vous avez besoin d'une ou plusieurs autres bases de structures
différentes. Vous créer alors d'autres singletons. Par exemple, vous aurez
GestCommDAO et GestPersonnelDAO, qui peuvent dériver d'une classe
abstraite ConnectDAO.
- Soit vous voulez sur le même modèle (paramétrable éventuellement) créer
(ou vous connecter sur) en dynamique des bases. Il y a certainement là des
techniques que j'ignore encore, mais vous pouvez toujours faire un
singleton ConnectionsDAO, qui va encapsuler et maintenir une Collection de
ConnectDAO. Dans votre FrmCnx, vous aurez par exemple:
AddConnection(String url, String user, String password)

--
Pierre Maurette





Avatar
Pierre Maurette
[...]
Je passe maintenant la connexion dans le constructeur de la FrmCnx.
Les variables sont passées en Java, me semble-t'il en valeur, et non en
référence.


Si j'ai bien compris, deux façons de voir la même chose:

- Les types primitifs sont passés par (copie de) valeur, les objets par
référence.

- Tout est passé par (copie de) valeur. Mais il faut alors assimiler
une objet à sa référence. Disons qu'on passe soit des types primitifs,
soit des références, dans les deux cas par valeur. Et rapprocher la
valeur d'une référence d'une adresse (une valeur de pointeur) est assez
juste il me semble. C'est délicat à expliquer et un peu de la sodomie
de diptère. C'est cette seconde "vision" que je préfère.

Comme j'en suis également au stade (Allez les bleus !) de la
découverte, j'ai profité de votre message pour faire quelques
expérimentations. Vous pouvez vous-même faire mumuse à partir de ce
code:

public final class test {

public static void main(String[] argv) {
int i = 10;
myint j = new myint(20);
myint k = new myint(30);
myint m = new myint(40);
myint n = new myint(50);
System.out.println("Dans main(): " +
i + " / " +
j + " / " +
k + " / " +
m + " / " +
n);
bidon(i, j, k, m, n);
System.out.println("Dans main(): " +
i + " / " +
j + " / " +
k + " / " +
m + " / " +
n);
}

static class myint implements Cloneable{
int i;

public myint(int i) {
this.i = i;
}

public String toString(){
return String.valueOf(i);
}

public String toAddressString(){
return super.toString();
}

public Object clone() {
Object nouveau = null;
try {
nouveau = super.clone();
}
catch (CloneNotSupportedException ex) {
}
return nouveau;
}

public void inc() {
i++;
}
}

static void bidon(int i, myint j, myint k, myint m, myint n) {
System.out.println("Dans bidon(): " +
i + " / " +
j + " / " +
k + " / " +
m + " / " +
n);
i++;
j.inc();
k = new myint(k.i);
k.inc();
m = j;
System.out.println("'Adresse' de j: " +
j.toAddressString() +
", de n: " +
n.toAddressString());
n = (myint)j.clone();
System.out.println("'Adresse' de j: " +
j.toAddressString() +
", de n: " +
n.toAddressString());
n.inc();
System.out.println("Dans bidon(): " +
i + " / " +
j + " / " +
k + " / " +
m + " / " +
n);
}
}



Mon object Connexion de ma FrmCnx ne pointe pas sur l'object Connexion de ma
FrmMain.
L'initialisation n'a lieu que dans ma FrmCnx.

Comment retourner l'object Connexion ?


Connection, l'objet et le mot anglais, et connexion le mot français ;-)

Pas de bol, on ne peut rien faire de ce qu'on a vu précédemment.
Connection est une interface, une classe abstraite en quelque sorte. On
ne peut en obtenir des instances valides qu'avec getConnection, méthode
static de DriverManager, dont il n'existe pas de version sans argument
d'ailleurs (il faut au moins l'URL). En d'autres termes, on ne peut
comme on le ferait pour un tableau par exemple, "nourrir" l'objet à
partir de la référence. On va donc faire par exemple:


Dans FrmMain:
private Connection Connexion = null;
/* ... */
public void setConnexion(Connection con){
Connexion = con;
}

Dans FrmCnx, vous créez un objet Connection connex à partir de rien,
puis vous faites:
((FrmMain)parent).setConnexion(connex);
si vous avez un constructeur FrmCnx(Object parent) et que vous
construisez par new FrmCnx(this)
Sinon:
((FrmMain)this.getParent()).setConnexion(connex);

Variante (que je préfère):
Dans FrmMain:
private Connection con = null;
/* ... */
public boolean Connecter(URL url, etc.){
con = DriverManager.getConnection(url, etc.);
return con != null;
}

Dans FrmCnx, vous vous contentez de collecter les URL etc., de les
vérifier puis d'appeler
((FrmMain)parent).Connecter(url, etc.);
ou
((FrmMain)this.getParent()).Connecter(url, etc.);

--
Pierre Maurette

Avatar
synopsis
Bon, Bon...J'ai trouvé une solution qui marche.
Je ne suis satisfait qu'à moitié : à moitié vide :((

Dans ma FrmMain

J'ai crée 2 méthodes getConnection et setConnection

public Connection getConnection() {
return Conn;
}

public void setConnection(java.sql.Connection Cnx) {
Conn = Cnx;
}

J'ouvre ma FrmCnx en passant la référence à la frm

new FrmCnx(this).setVisible(true);


Dans FrmCnx :

try{

FrmParent.setConnection(DriverManager.getConnection(this.url,
this.login, this.password));

JOptionPane.showConfirmDialog(null, "Connexion établie",
"Information", JOptionPane.DEFAULT_OPTION);
this.setVisible(false);
this.dispose();

} catch(Exception sqlE){

System.out.println(sqlE.getMessage());
JOptionPane.showConfirmDialog(null, "Impossible de se connecter à
"+url+".", "Connexion...", JOptionPane.DEFAULT_OPTION);
this.url = null;
this.login = null;
this.password = null;

}

Je ne suis pas satisfait de ma FrmCnx, car dans cette class je fais
référence à ma FrmMain.
Donc ma FrmCnx n'est pas réutilisable dans un autre programme. PAS BIEN !!


La bonne méthode est celle vous aviez décrite dans un précédent Mail.

Les objets connexions doivent étre géré dans une Class DAO.
et ma FrmCnx est une sous-class de DAO.

Pour décrire schématiquement ma class DAO :

connId = DAO.Add() // appel la sous-class FrmCnx puis retourne l'ID de la
connection si valide.

myConn = DAO.getConnection( ConnId ) // retourne l'objet connection
DAO.Close(connId)
DAO.CloseAll()
....

De cette façon, mes connexions qui peuvent être multiples, sont très facile
à manipuler.

Bref, j'ai travaillé à l'envers...c'est pourquoi j'ai un "peu" galéré :-P

Merci beaucoup.




"Pierre Maurette" a écrit dans le message de
news:
[...]
Je passe maintenant la connexion dans le constructeur de la FrmCnx.
Les variables sont passées en Java, me semble-t'il en valeur, et non en
référence.


Si j'ai bien compris, deux façons de voir la même chose:

- Les types primitifs sont passés par (copie de) valeur, les objets par
référence.

- Tout est passé par (copie de) valeur. Mais il faut alors assimiler une
objet à sa référence. Disons qu'on passe soit des types primitifs, soit
des références, dans les deux cas par valeur. Et rapprocher la valeur
d'une référence d'une adresse (une valeur de pointeur) est assez juste il
me semble. C'est délicat à expliquer et un peu de la sodomie de diptère.
C'est cette seconde "vision" que je préfère.

Comme j'en suis également au stade (Allez les bleus !) de la découverte,
j'ai profité de votre message pour faire quelques expérimentations. Vous
pouvez vous-même faire mumuse à partir de ce code:

public final class test {

public static void main(String[] argv) {
int i = 10;
myint j = new myint(20);
myint k = new myint(30);
myint m = new myint(40);
myint n = new myint(50);
System.out.println("Dans main(): " +
i + " / " +
j + " / " +
k + " / " +
m + " / " +
n);
bidon(i, j, k, m, n);
System.out.println("Dans main(): " +
i + " / " +
j + " / " +
k + " / " +
m + " / " +
n);
}

static class myint implements Cloneable{
int i;

public myint(int i) {
this.i = i;
}

public String toString(){
return String.valueOf(i);
}

public String toAddressString(){
return super.toString();
}

public Object clone() {
Object nouveau = null;
try {
nouveau = super.clone();
}
catch (CloneNotSupportedException ex) {
}
return nouveau;
}

public void inc() {
i++;
}
}

static void bidon(int i, myint j, myint k, myint m, myint n) {
System.out.println("Dans bidon(): " +
i + " / " +
j + " / " +
k + " / " +
m + " / " +
n);
i++;
j.inc();
k = new myint(k.i);
k.inc();
m = j;
System.out.println("'Adresse' de j: " +
j.toAddressString() +
", de n: " +
n.toAddressString());
n = (myint)j.clone();
System.out.println("'Adresse' de j: " +
j.toAddressString() +
", de n: " +
n.toAddressString());
n.inc();
System.out.println("Dans bidon(): " +
i + " / " +
j + " / " +
k + " / " +
m + " / " +
n);
}
}



Mon object Connexion de ma FrmCnx ne pointe pas sur l'object Connexion de
ma FrmMain.
L'initialisation n'a lieu que dans ma FrmCnx.

Comment retourner l'object Connexion ?


Connection, l'objet et le mot anglais, et connexion le mot français ;-)

Pas de bol, on ne peut rien faire de ce qu'on a vu précédemment.
Connection est une interface, une classe abstraite en quelque sorte. On ne
peut en obtenir des instances valides qu'avec getConnection, méthode
static de DriverManager, dont il n'existe pas de version sans argument
d'ailleurs (il faut au moins l'URL). En d'autres termes, on ne peut comme
on le ferait pour un tableau par exemple, "nourrir" l'objet à partir de la
référence. On va donc faire par exemple:


Dans FrmMain:
private Connection Connexion = null;
/* ... */
public void setConnexion(Connection con){
Connexion = con;
}

Dans FrmCnx, vous créez un objet Connection connex à partir de rien, puis
vous faites:
((FrmMain)parent).setConnexion(connex);
si vous avez un constructeur FrmCnx(Object parent) et que vous construisez
par new FrmCnx(this)
Sinon:
((FrmMain)this.getParent()).setConnexion(connex);

Variante (que je préfère):
Dans FrmMain:
private Connection con = null;
/* ... */
public boolean Connecter(URL url, etc.){
con = DriverManager.getConnection(url, etc.);
return con != null;
}

Dans FrmCnx, vous vous contentez de collecter les URL etc., de les
vérifier puis d'appeler
((FrmMain)parent).Connecter(url, etc.);
ou
((FrmMain)this.getParent()).Connecter(url, etc.);

--
Pierre Maurette





Avatar
synopsis
Je pense être arrivé à une solution satisfaisante :

Pour résumé :
- FrmMain est la fenêtre principale
- ConnMain est l'object connexion associée à FrMain
- FrmCnx est la fenêtre connexion (avec 3 JTextField : url, login, password)
; peut-être "vue" comme une Dialogbox enrichie
- connCnx object Connexion associé à FrmCnx

1) FrmCnx est Modal

2) J'ai déclaré la connection comme static : private static connCnx;

3) J'ai implémenté la méthode getConnection comme static :

public static Connection getConnection() {
return new FrmCnx().connCnx ;
}

4) Au final et tout simplement dans ma fenêtre principale :

connMain = FrmCnx().getConnection()

if (connMain !=null) {
....
} else {
....
}



"Raphael Tagliani" a écrit dans le message de
news:
Ta connexion ne devrait pas dépendre de ta GUI.
Pour éviter tes problèmes, tu peux faire, par exemple une classe
DBConnection (Singleton, constructeur privé), avec une méthode statique
getConnection() (qui instancie une DBConnection la première fois, puis
retourne la connexion).

Puis:
1) ton programme se lance

1.1) tu lances l'interface graphique avec un bouton établir connexion
XOR
1.2) tu crée la connexion lorsque le prog se lance

2) Une fois la connexion établie, tu peux l'avoir où tu veux en faisant:
DBConnection.getConnection()

Fais bien attention aux exceptions.

En passant, un meilleur titre pour le sujet aurait été
"java.sql.Connection" ou quelque chose de moins général que 'Appli Java'.

synopsis wrote:
Merci pour votre aide.

J'ai décidé de passer l'object connection "Conn" de la frame principale
"FrmMain" au constructeur de la frame connection "FrmCnx"

Je rencontre à ce niveau un autre problème.

Comme l'objet "Conn" n'est pas instancié, cette méthode ne marche.

Pour instancier l'objet, je dois monter ma connexion (
DriverManager.getConnection(url, login, password))
Les paramètres de connexion ne sont connu que dans FrmCnx.

private void MnuConnectActionPerformed(java.awt.event.ActionEvent evt) {
java.sql.Connection Conn;
new FrmCnx(Conn).setVisible(true);
}


Comment contourner ce problème ?




"Xavier Tarrago" a écrit dans le
message de news: e6b86j$b09$

Je ne connais pas l'objet Connexion et je ne commente donc pas son
utilisation. Ce qui suit concerne le partage d'objets et leur durée de
vie.

Un objet dure aussi longtemps qu'une référence pointe dessus. Si la
connexion doit durer pendant toute l'application, il doit y avoir une
référence qui dure aussi longtemps. Le bon endroit est effectivement la
frame principale de l'application. Elle doit etre dans un membre privé de
la
classe (règle de programmation). Pour qu'elle soit visible depuis
d'autres
frames, il faut soit passer cette connection au constructeur de l'autre
frame, soit que l'autre frame ait une référence sur la frame principale
et
que la frame principale ait une méthode getConnexion() (ou
getConnexion(int
index) si il y en a plusieurs) qui retourne la (ou une) connexion.

J'espère ne pas avoir été hors sujet.

"synopsis" a écrit dans le message de
news:44888bdc$0$10989$

// Lorsque je ferme ma Frame Connexion, je perd mon objet Connexion.
// Si je déclare l'objet Connexion dans ma frame principale, elle n'est


pas

visible dans frame Connexion (le compilateur bug)
même en passant par un

public void Connect(String url, String login, String password) {
..
}

Ou et comment créer un objet connexion (java.sql.connection) GLOBAL ?
C'est objet doit-être visible de partout dans l'application, par toute
les
classes.

Pour démarrer, je souhaite ne créer qu'un seul objet Connexion.
Dans l'avenir, il sera possible de se connecter simultanénement


(instancier)

plusieurs connexions.

Merci.

Cordialement,