PDA

View Full Version : [Java] JDBC e disegno di immagini


Falcon_DAoC
25-02-2005, 09:47
Sono ancora qui a chiedervi aiuto per Java... i mie problemi sono:
1) per poter utilizzare un databese con JDBC è necessario caricare i driver del DBMS tramite la shell; non esiste un modo per caricare questi driver senza che l'utente debba intervenire tramite comandi da shell (poichè l'utente medio non ha familiarità con essi)?
2) ho la necessità di disegnare un immagine in un pannello JPanel, il problema consiste nel fato che tale pannello è di dimensioni troppo ridotte per contenere l'immagine e non posso ridimensionare quest'ultima (per motivi estetici). Esiste un modo per indicare arbitrariamente le dimensioni del pannello (ho provato con il metodo setSize() ma non ha dato alcun effetto)?

Thx a tutti coloro che mi risponderrano ;)

kingv
25-02-2005, 09:55
Originariamente inviato da Falcon_DAoC
Sono ancora qui a chiedervi aiuto per Java... i mie problemi sono:
1) per poter utilizzare un databese con JDBC è necessario caricare i driver del DBMS tramite la shell; non esiste un modo per caricare questi driver senza che l'utente debba intervenire tramite comandi da shell (poichè l'utente medio non ha familiarità con essi)?



spiegati meglio, cos'e' che deve fare l'utente?
se l'utente chiama un batch (o uno script di shell) che setta il classpath aggiungendo i drivers jdbc non va bene?

Falcon_DAoC
25-02-2005, 14:18
In poche parale devo semplicemente fare un'applicazione con una GUI per l'utente che possa accedere ad un database, il problema è che nelle applicazioni che utilizzano JDBC devono essere caricati i driver del DBMS che si intende utilizzare. Il caricamento viene effettuato tramite il passaggio di argomenti al comando "java" (o "javac") eseguito in sell in modo tale da aggiungerlo al classpath. Volevo trovare un modo per far si che l'applicazione stessa di Java caricasse tali driver senza il bisogno dell'intervento dell'utente da shell.
Mentre pensavo ad una soluzione ho trovato il metodo exec che permette di eseguire il codece contenuto in un file, quindi potrei aggirare il problema in questo modo... appena ho un attimo di tempo provo :D
Se qualcuno ha una soluzione migliore si faccia avanti, i consigili (e le critiche) son sempre ben accetti ^O^.

Thx

P.S: plz aiutatemi anche con il ridimensionamento del pannello ç_ç

Falcon_DAoC
26-02-2005, 15:24
up :cry:

kingv
26-02-2005, 18:55
per il primo problema prova una roba del genere:


URL url = new URL("jar:file:/mypath/mydriver.jar");
String nomedriver = "il.mio.Driver";
URLClassLoader urlcl = new URLClassLoader(new URL[] { url });
DriverManager.registerDriver((Driver)Class.forName(nomedriver, true, urlcl).newInstance());




naturalmente il jar e il nome della classe che implementa Driver li devi avere

Falcon_DAoC
26-02-2005, 19:27
Thx mille, ora provo ;)

kingv
26-02-2005, 19:41
Originariamente inviato da Falcon_DAoC
Thx mille, ora provo ;)



fammi sapere, non sono sicuro funzioni perche' qui non posso provare.
non vorrei che per ragioni di sicurezza DriverManager si rifiutasse di caricare una clase con un classloader diverso da quello di default.

Falcon_DAoC
26-02-2005, 20:15
mi da un MalformedURLException nell'istruzione:

URL url = new URL("jar:file:hsqldb/lib/hsqldb.jar");

e non ne capisco il motivo ?_?

Falcon_DAoC
26-02-2005, 20:19
Ok ho risolto con:

URL url = new URL("jar:file:hsqldb/lib/hsqldb.jar!/");

poichè ho trovato sul sito della sun che ci vuole "!/", anche se non ne ho capito la necessità...

Falcon_DAoC
26-02-2005, 20:30
uff ancora probelmi, ora mi da un IllegalArgumenException in:

DriverManager.registerDriver((Driver)Class.forName(nomedriver, true, urlcl).newInstance());

Ho spezzato l'istruzione in:

Driver driver = (Driver)Class.forName(nomedriver,true,urlcl).newInstance();
DriverManager.registerDriver(driver);

e mi da la stessa eccezione in:

Driver driver = (Driver)Class.forName(nomedriver,true,urlcl).newInstance();

Che potrebbe essere??
La variabile nomedriver contiene "jdbc:hsqldb:hsql".

Falcon_DAoC
26-02-2005, 20:49
ok niubbata mia... sbagliato il nome del driver :muro: :muro: :muro:

String nomedriver = "org.hsqldb.jdbcDriver";

Falcon_DAoC
26-02-2005, 20:57
mmm ora però da un prob che non credo essere in grado di risolvere... il codice è il seguente:
-----------------------------------------------------------------------------------
try
{
URL url = new URL("jar:file:hsqldb/lib/hsqldb.jar!/");
System.out.println("url OK");

String nomedriver = "org.hsqldb.jdbcDriver";
System.out.println("nome driver OK");

URLClassLoader urlcl = new URLClassLoader(new URL[] { url });
System.out.println("URL class loader OK");

Driver driver = (Driver)Class.forName(nomedriver,true,urlcl).newInstance();
System.out.println("Driver OK");

DriverManager.registerDriver(driver);
System.out.println("registrazione driver OK");
}catch(Exception e)
{
javax.swing.JOptionPane.showMessageDialog(null, e.toString());
}

Connection conn = null;
Statement stmt = null;
ResultSet rset = null;

try
{
conn = DriverManager.getConnection("jdbc:hsqldb:hsql://127.0.0.1:8888","sa","");
System.out.println("Connessione stabilita...");
stmt = conn.createStatement();
System.out.println("Statement creato...");
stmt.execute("DROP TABLE quotes IF EXISTS;");
System.out.println("Query eseguite...");
}catch(java.sql.SQLException sqlE)
{
javax.swing.JOptionPane.showMessageDialog(null, sqlE.toString());
}

try
{
rset.close();
System.out.println("Recordset chiuso...");
}catch(Exception e)
{
javax.swing.JOptionPane.showMessageDialog(null, e.toString());
}
try
{
stmt.close();
System.out.println("Statement chiuso...");
}catch(Exception e)
{
javax.swing.JOptionPane.showMessageDialog(null, e.toString());
}
try
{
conn.close();
System.out.println("Connessione chiusa...");
}catch(Exception e)
{
javax.swing.JOptionPane.showMessageDialog(null, e.toString());
}
-----------------------------------------------------------------------------------

Mi presenta un SQLException: No suitable driver all'istruzione:

conn = DriverManager.getConnection("jdbc:hsqldb:hsql://127.0.0.1:8888","sa","");

:cry: :muro: :cry: :muro: :cry: :muro:

tglman
26-02-2005, 22:25
Scusa ma se i driver li devi lanciare al momento dell'apertura del pogramma puoi creare un semplice programmino che appunto apra il tuò programma con i parametri inseriti correttamente.

mi pare che per le dimenzioni di un oggetto si debba usare setbound

kingv
27-02-2005, 01:47
Originariamente inviato da Falcon_DAoC
conn = DriverManager.getConnection("jdbc:hsqldb:hsql://127.0.0.1:8888","sa","");

:cry: :muro: :cry: :muro: :cry: :muro:


faccio una prova domattina, a quest'ora dubito di avere abbbastanza neuroni accesi per tentare solo di capire che succede :D

Falcon_DAoC
27-02-2005, 12:12
Originariamente inviato da kingv
faccio una prova domattina, a quest'ora dubito di avere abbbastanza neuroni accesi per tentare solo di capire che succede :D

Ok, grazie mille per il tempo che mi stai dedicando ;)

Falcon_DAoC
27-02-2005, 13:10
Originariamente inviato da tglman
Scusa ma se i driver li devi lanciare al momento dell'apertura del pogramma puoi creare un semplice programmino che appunto apra il tuò programma con i parametri inseriti correttamente.

si quello si può fare e funziona, il problema è che se, per esempio preparo un *.bat da eseguire per poi lanciare il programma vero e proprio con i paramenti del caricamento driver, tale programma non sarà più multipiattaforma (io ho provato con il metodo exec()).

Originariamente inviato da tglman
mi pare che per le dimenzioni di un oggetto si debba usare setbound

Il setBound() serve per settare posizione e dimensione ma funziona quasi esclusivamente sui Frame (o JFrame), purtroppo non da alcun effetto applicato ad un pannello o qualsiasi altro compoente grafico poichè essi seguono la disposizone indicata dal Layout. Questa almeno è la mia esperienza; esperienze contrarie son ben accette anche perchè mi toglierebbero un bel problema
:p

kingv
27-02-2005, 20:14
Originariamente inviato da Falcon_DAoC
Ok, grazie mille per il tempo che mi stai dedicando ;)


ho provato, il problema è come supponevo che DriverManager non carica la classe come dovrebbe (probabilmente per il motivo che ho nominato prima).

ho trovato un "accrocchio" ma è una mezza schifezza, creati una classe:

class FintoDriver implements Driver
{
private Driver driver;
FintoDriver (Driver driver)
{
this.driver = driver;
}
public boolean acceptsURL (String url) throws SQLException
{
return this.driver.acceptsURL (url);
}
public Connection connect (String url, Properties p) throws SQLException
{
return this.driver.connect (url, p);
}
public int getMajorVersion ()
{
return this.driver.getMajorVersion ();
}
public int getMinorVersion ()
{
return this.driver.getMinorVersion ();
}
public DriverPropertyInfo[] getPropertyInfo (String string,
Properties p) throws
SQLException
{
return this.driver.getPropertyInfo (string, p);
}
public boolean jdbcCompliant ()
{
return this.driver.jdbcCompliant ();
}
}


e modifica la chiamata nel tuo codice così:


Driver driver = (Driver) Class.forName (nomedriver, true, urlcl).newInstance ();
DriverManager.registerDriver (new FintoDriver (driver));

Falcon_DAoC
28-02-2005, 09:51
OK, funziona tutto a dovere. Thx mille dell'aiuto che mi hai dato ;) :ave: :ave:

Falcon_DAoC
02-03-2005, 10:34
Qualcuno sa darmi una mano anche con questo:
2) ho la necessità di disegnare un immagine in un pannello JPanel, il problema consiste nel fato che tale pannello è di dimensioni troppo ridotte per contenere l'immagine e non posso ridimensionare quest'ultima (per motivi estetici). Esiste un modo per indicare arbitrariamente le dimensioni del pannello (ho provato con il metodo setSize() ma non ha dato alcun effetto)?

Thx :p