PDA

View Full Version : Domande di Java



Hardcore
1st September 2007, 10:53
ho notato che questo forum è frequentato da diversi programmatori,quindi provo a chiedervi alcune cose, che ho l'esame imminente e ho alcuni problemi irrisolti.

Allora, per l'esame avevo l'idea di portare un programma per la gestione di una biblioteca,all'avvio si inserisce user e password, e a seconda si può accedere alla finestra USER o alla finestra ADMIN.
detto questo , i problemi che ho per ora sono i seguenti:

a)Nella finestra iniziale per ora ho solo 1 pannello, che contiene i vari elementi (Titolo,SubTitolo,Textfield User ,TextField Psw,JButton Accedi), per avviarsi va anche bene, ma in quanto layout fa schifo.La mia idea sarebbe creare 3 pannelli distinti (1 con Titolo e Sub Titolo, 1con i due TextField, 1 con il Pulsante accedi) in modo da poter gestire meglio tale layout c'è un modo di inserire questi 3 pannelli sopra un altro pannello praticamente vuoto,impostato con un layot Grid Layout (3,2)?

b)Nei TextField completo il campo cosi user=new JTextField ("<user>",30)
quando però vado a scrivare devo cancellare con il backspace <user> e poi scrivere, c'è un modo per fare si che quando clicco quello spazio, la scritta <user> scompaia?

Grazie in anticipo ;)

Hardcore
3rd September 2007, 16:20
Altre domande:

a)c'è un modo per fare si che premendo un pulsante che avvia un nuovo pannello, far scomparire il vecchio,in modo da visualizzare il nuovo nella finestra?perchè allo stato attuale devo far partire un nuovo JFrame a parte.

Kat
3rd September 2007, 18:13
Le API grafiche Java non le conosco bene, pero' qualcosa ti posso dire dalla prospettiva C#/.NET.

Per il punto b del primo post: puoi catturare l'evento del TextField relativo al click del mouse, e impostare la stringa del TextField stesso a stringa vuota.

Per il punto a del secondo post: i componenti grafici dovrebbero avere un metodo che li rende visibili o meno. Potresti avere piu' pannelli sovrapposti e visualizzare solo quello che ti interessa in un determinato momento. In C# c'e' una property apposita, presumo che ci sia un metodo analogo in Java.

Axet
3rd September 2007, 18:55
ho notato che questo forum è frequentato da diversi programmatori,quindi provo a chiedervi alcune cose, che ho l'esame imminente e ho alcuni problemi irrisolti.

Allora, per l'esame avevo l'idea di portare un programma per la gestione di una biblioteca,all'avvio si inserisce user e password, e a seconda si può accedere alla finestra USER o alla finestra ADMIN.
detto questo , i problemi che ho per ora sono i seguenti:

a)Nella finestra iniziale per ora ho solo 1 pannello, che contiene i vari elementi (Titolo,SubTitolo,Textfield User ,TextField Psw,JButton Accedi), per avviarsi va anche bene, ma in quanto layout fa schifo.La mia idea sarebbe creare 3 pannelli distinti (1 con Titolo e Sub Titolo, 1con i due TextField, 1 con il Pulsante accedi) in modo da poter gestire meglio tale layout c'è un modo di inserire questi 3 pannelli sopra un altro pannello praticamente vuoto,impostato con un layot Grid Layout (3,2)?

Direi che puoi mettere due jPanel nello stesso jFrame e li ordini con il border layout (north quello che vuoi lasciare sopra, south quello sotto).

All'interno del jPanel che piazzi sopra metti altri due jPanel e li ordini con il flow layout oppure con il border layout usando east e west ;)


b)Nei TextField completo il campo cosi user=new JTextField ("<user>",30)
quando però vado a scrivare devo cancellare con il backspace <user> e poi scrivere, c'è un modo per fare si che quando clicco quello spazio, la scritta <user> scompaia?

Grazie in anticipo ;)

Si, puoi.
Se non ricordo male ci dovrebbe essere l'evento di click sul textfield.
Basta quindi che lo gestisci nel listener impostando, quando avviene l'evento, il valore del textfield come "" :O


Altre domande:
a)c'è un modo per fare si che premendo un pulsante che avvia un nuovo pannello, far scomparire il vecchio,in modo da visualizzare il nuovo nella finestra?perchè allo stato attuale devo far partire un nuovo JFrame a parte.

Gioca con il metodo .setVisible nel listener, gestendo l'evento di pressione del jButton

Hardcore
3rd September 2007, 19:18
il punto c ho risolto passando per riferimento il pannello principale e quando viene premuto Accedi, viene creata una nuova finestra e chiuso il pannello principale della nuova finestra :look:

Alkabar
3rd September 2007, 20:36
se vuoi il posizionamento assoluto, nella tua classe in cui assembli la GUI

/** Add Component Without a Layout Manager (Absolute Positioning) */
private void addComponent(Container container,Component c,int x,int y,int width,int height)
{
c.setBounds(x,y,width,height);
container.add(c);
}

Trick gratuito :elfhat: .

Dove il container è il pannello. Aspe che mi leggo il resto.

Alkabar
3rd September 2007, 20:38
il punto c ho risolto passando per riferimento il pannello principale e quando viene premuto Accedi, viene creata una nuova finestra e chiuso il pannello principale della nuova finestra :look:

Va bene, non c'è niente di malvagio in tutto ciò, lol.


edit: Axet ha detto bene per la GUI, per gestire l'evento di click, la classe in cui assembli la GUI deve implementare l'interfaccia MouseListener(o simile), poi devi scrivere quello che succede dentro al metodo che gestisce il click.

Hardcore
3rd September 2007, 21:26
problema con la gui del TextField,

ho creato una classe per il MouseListener,
al suo interno c'è il metodo mouseclick che per me sarebbe ottimo, ma nn so cosa scrivergli dentro per dirgli di far diventare "" il textField, l'unico listenere che ho modificato per ora usava System.exit()..

Axet
3rd September 2007, 22:18
Cioè usi le GUI senza nemmeno saper impostare sta cosa -.-
Usa il metodo .setText del TextField quando gestisci l'evento "e = MouseClick" inerente al Textfield:

TextField.setText("");

Btw se usi eclipse ti fa vedere tutti i metodi vari dell'oggetto che t'interessa :D

edit:
anzi no, mi sa che l'evento mouseclick non va bene.. ci dovrebbe essere un evento per quando selezioni la textfield se non ricordo male, è un po' che non uso le GUI :D

Hardcore
3rd September 2007, 23:26
son riuscito a risolver passando per riferimento i Textfield , all'actionlistener

altra cosa un po piu complessa,

La finestra è composta da Due TextField User e Password
e da un Button Accedi

io devo fare che scrivo user poi scrivo la psw e queste due stringhe vengono mandate al pannello di Accedi in cui poi l'actionlistener farà quello che io voglio.
il problema però per me sta appunto nel passare tali stringhe quando ho scritto user e psw, per ora riesco solo a passarle all'inizio quando inizializzo i 3 pannelli.


Per Capirci meglio:
_________________________________
import java.awt.*;

import javax.swing.*;

//Pannello Iniziale Del Programma
public class PanIng extends JPanel {






public PanIng(JFrame riferimento){
super();
JFrame referto=riferimento;
PanButMain but;
PanTextMain txtmain;
PanTitoliMain titlemain;
//Inizializzazione dei 3 sotto pannelli
but= new PanButMain(referto);
txtmain= new PanTextMain();
titlemain=new PanTitoliMain();

setLayout(new GridLayout(3,1));

add(titlemain);
add (txtmain);
add(but);


}

}

_____________________________________
//Pannello dei TextField

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

import javax.swing.event.*;
public class PanTextMain extends JPanel implements ActionListener{
//Pannello dei TextField del Main
JTextField user,psw;
Font usrpsw= new Font("Arial",Font.BOLD,10);
public PanTextMain(){
super();
setLayout(new GridLayout(1,2));
setPreferredSize(new Dimension(100,10));
// //Definisco il TextField user
user = new JTextField("USER: ",30);
user.setAlignmentX(100);
user.setFont(usrpsw);
user.setAlignmentY(300);


//Definisco il TextField psw
psw= new JTextField("PASSWORD: ",30);
psw.setAlignmentX(300);
psw.setFont(usrpsw);
psw.setAlignmentY(300);

add(user);
add(psw);
}



}

_________________________


import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;
public class PanButMain extends JPanel implements ActionListener {
//Pannello contenente il JButton Accedi del Pannello Main
JButton accedi;
Font usrpsw= new Font("Arial",Font.BOLD,10);
JFrame refer;
public PanButMain(JFrame riferimento){
super();
//Proprietà Del Pulsante Accedi;
accedi=new JButton("Accedi");
accedi.setAlignmentX(200);
accedi.setAlignmentY(400);
accedi.setFont(usrpsw);


refer=riferimento;
add(accedi);
accedi.addActionListener(this);

}

public void actionPerformed (ActionEvent e){refer.setVisible(false);
JFrame User= new JFrame("User Biblioteca");
User.setBounds(400,400,640,480);
UserPan Pannelloutente=new UserPan();
Container cont=User.getContentPane();
cont.add(Pannelloutente);
User.show();
}




}


io voglio che scrivo la user nel textfield user, la psw nel textfield psw, queste due stringhe vengano passate poi al pannello UserPan dove nell'action listener verrà eseguito quello che desidero, c'è un modo per farlo?
sto provando ma mi passa sempre le due stringhe vuote usando il metodo getText(), che riesco a passare all'inizializzazione del button, nn dopo :cry:

Axet
3rd September 2007, 23:48
Non ho letto tutto il programma che non ho assolutamente sbatta, ho letto solo l'ultima cosa che hai scritto.

Hai provato a salvare il valore che ottieni con il getText in una stringa e passare poi la stringa?

ahzael
4th September 2007, 01:02
Usa netBeans 5.5 che ha il menu grafico per fare la GUI, si bello bello che lo sai fare in codice, ma quando poi vai li fuori, usi i diversi tool che ci sono in giro, la gente non pretende mica che tu scrivi col notepad :D
Ovvio che devi saperli usare anche col notepad eh..........
cmq vabbe ,ti butto sti 2 programmi che ho fatto un po di tempo fa :) per darti un idea.
Enjoy


il secondo era troppo grande per metterlo su wayne
http://files-upload.com/files/479172/ass3.zip

Axet
4th September 2007, 01:07
Se ha un esame la gui la deve gestire via codice per forza eh t_t

Hardcore
4th September 2007, 11:23
con un po di fatica ho risolto tutto, ora sono all'ultimo grande problema :confused:

devo leggere da file delle stringhe e confrontarle con la stringa User che io ho inserito, il mio problema è che nn so come fare

faccio un esempio Ho il file User.txt che contiene

pippo
paperino
topolino
ciccio
pluto



io da user inserisco pluto

ora la mia idea sarebbe di creare una lista dinamica,che aggiunge piano piano ciò che legge e intanto confronta, quando trova l'uguale dice OK User Trovato.

come si fa:look:

Tanek
4th September 2007, 11:52
Ma non è meglio che il check lo fai solo ad utente inserito? (cioè quando l'utente fa invio) Non man mano (da quello che ho capito dalla tua descrizione).

Leggiti la javadoc del BufferedReader per questa operazione cmq ;)

Hardcore
4th September 2007, 12:20
il check viene fatto nel seguente modo:

c'è una serie if ed else che controlla che nei TextField venga inserito un valore,se ciò non avviene appare una finestrella di errore che dice cosa inserire.

quando viene inserito sia in user sia in password qualcosa, vorrei far cominciare il check sul file user.txt, mediante lista, spiego anche perke brevemente
tramite la lista posso trovare l'indice del mio user, e andarlo a mettere nella lista presa da password.txt, questo viene fatto perke a uno user corrisponda la password giusta, se no nn saprei come implementare ciò e potrebbe succedere che pippo entra con la password di paperino.

Karidi
4th September 2007, 14:09
il check viene fatto nel seguente modo:

c'è una serie if ed else che controlla che nei TextField venga inserito un valore,se ciò non avviene appare una finestrella di errore che dice cosa inserire.

quando viene inserito sia in user sia in password qualcosa, vorrei far cominciare il check sul file user.txt, mediante lista, spiego anche perke brevemente
tramite la lista posso trovare l'indice del mio user, e andarlo a mettere nella lista presa da password.txt, questo viene fatto perke a uno user corrisponda la password giusta, se no nn saprei come implementare ciò e potrebbe succedere che pippo entra con la password di paperino.

Non puoi farlo fare a un mini DB? Creando un DataSource con ConnectionPool, sinceramente 1 .txt con password in chiaro e tutte insieme amorevolmente mi mette un pochino d'ansia :afraid:

ahzael
4th September 2007, 14:50
un sec sto al telefono con la donna e rispondo :)

ahzael
4th September 2007, 15:07
okkey eccomi

devi usare il tokeniser


public static void main (String[] args)
{


try {
StreamTokenizer tin = new StreamTokenizer(new BufferedReader(new FileReader("c:/filename.txt")));

while (tin.nextToken() != tin.TT_EOF) {

if (tin.sval.equals(USERNAME) {

System.out.println("SOOOOOKA");
}
}
}


allora come funge, lo stream tokenizer riceve il file di testo e divide il tutto in token (di default i tokens sono divisi per lo spazio bianco), quindi va nel while, il while controlla che il next token non e' la fine del file, quindi fa l operazione di controllo
se il tin.sval che e' una stringa equivale alla stringa username fai questo, altrimenti continua avanti col next token

ahzael
4th September 2007, 15:15
oppure crei una lista di oggetti user e fai un for loop tipo questo

for(int a=0;a<arrayusers.leght;a++)
{
if (arrayusers[a].username.equals(STRINGA USERNAME DAL TEXTFIELD&&
arrayusers[a].password.equals(stringa della password)
{System.out.println("SOKA")};
}




ricordati di usare equals e non ==

Hardcore
4th September 2007, 16:07
non posso usare un db, non è un programma di lavoro ma per un esame e presentarmi con un db e cose simili quando li farò fra 3 anni , potrebbe far puzzare di ''l'ho scaricato da internet''
@azhael: ora come ora il metodo che sto utilizzando è il seguente:
ublic boolean RicercaUsr(String user) throws Exception{usr=user; i=0;
FileReader fr= new FileReader("Password.txt");
BufferedReader bf=new BufferedReader(fr);
String s;
ListNode lista = new ListNode();
while((s=bf.readLine())!=null){if (usr.equals(s)) return true;
else i++;
}
fr.close();
return false;
}
public int RitornaIndiceUser(){return i;}
}
dopo di che creo una lista con tutte le psw, è una lista con riferimenti,e passo l'indice, il problema attuale è che nn so come trovare l'elemento di indice i all'interno della lista, se trovo come si fa sono a cavallo perke posso paragonarlo con la psw da me inserita.
per risolvere questo problema ho pensato di fare cosi
public boolean RicercaPsw(String password,int indice) throws Exception{psw=password;
int cont;
FileReader fr= new FileReader("Password.txt");
BufferedReader bf=new BufferedReader(fr);
String s;
ListNode lista = new ListNode();
do {lista.insert(s);}
while((s=bf.readLine()!=null&&cont!=indice)
in pratica creerei una lista di dimensione indice e ottengo la psw leggendo l'ultimo elemento della lista

Karidi
4th September 2007, 16:23
non posso usare un db, non è un programma di lavoro ma per un esame e presentarmi con un db e cose simili quando li farò fra 3 anni , potrebbe far puzzare di ''l'ho scaricato da internet''
@azhael: ora come ora il metodo che sto utilizzando è il seguente:
ublic boolean RicercaUsr(String user) throws Exception{usr=user; i=0;
FileReader fr= new FileReader("Password.txt");
BufferedReader bf=new BufferedReader(fr);
String s;
ListNode lista = new ListNode();
while((s=bf.readLine())!=null){if (usr.equals(s)) return true;
else i++;
}
fr.close();
return false;
}
public int RitornaIndiceUser(){return i;}
}
dopo di che creo una lista con tutte le psw, è una lista con riferimenti,e passo l'indice, il problema attuale è che nn so come trovare l'elemento di indice i all'interno della lista, se trovo come si fa sono a cavallo perke posso paragonarlo con la psw da me inserita.

Capito ;)

ahzael
4th September 2007, 16:28
tralasciando il fatto che una lista del genere secondo me ti conveniva farla con un array se non sai usare la lista, vabbe cmq, una linkedlist ha un di solito 2 variabili, una e' il dato vero e proprio (che puo essere l indice ora), l altro e' l altro nodo, a meno che non e' l ultimo che ha un valore "null";

putroppo in java non mi viene in mente ora, cmq funzionano bene o male tutte allo stesso modo.

while(node.nextnode=!null)
{
if(node.index==index(quello che cerchi tu)
{System.out.println("HURRAAAAAAAA");
else
node.nextnode;
}


in questo modo il while cerca nel nodo, controlla l indice, non ce , allora il nodo attuale diventa il prossimo nodo e tutto continua fino a che non lo trova.

Se hai problemi addami su msn, alexbonti83@hotmail.com

sono indaffarato anche io a programmare per scuola ora, quindi alla peggio se non ti rispondo sai perche :)

Hardcore
4th September 2007, 17:49
mi puoi scrivere come hai implementato nextnode?

perke nell'else a me da errore

questa è la mia classe node
public class Node {

Object info;
Node next;

public Node(Object o){
this(o,null);
}
public Node(Object o, Node n){
info=o;
next=n;
}
}


Questo il metodo ricerca psw

blic boolean RicercaPsw(String password,int indice) throws Exception{psw=password;
int cont=0;
FileReader fr= new FileReader("Password.txt");
BufferedReader bf=new BufferedReader(fr);
String s;
ListNode lista = new ListNode();
while((s=bf.readLine())!=null&&cont!=(indice+1))
{lista.insert(s);cont++;}
while(lista.node.next!=null)
{
if(lista.node.info.equals(psw))
{return true;}
else {}

}
fr.close();
return false;


}
}
se nel else dico node.next mi da errore
sinceramente nn vorrei che lui sia gia al node finale, e deba io rimandarlo al node 0 .

ahzael
5th September 2007, 01:20
scusa ero a nanna :) tanto mi sa che oramai dormi pure te, piu tardi controllo ^^

Hardcore
5th September 2007, 09:24
scusa ero a nanna :) tanto mi sa che oramai dormi pure te, piu tardi controllo ^^
Guardando sul libro di java, credo di aver capito che la lista che ho implementato io è una lista in cui, un nodo conosce il successivo e può andare solo in un verso , ma non tornare indietro.

Ok Trovato l'errore ho inserito in tutto il sistema dei System.out per vedere come venivano passati i valori, il cercatore user funziona da dio, cerca e trova e ritorna l'indice dello user perfettamente, il psw invece,prende la psw della prima riga e lo inserisce nella lista e basta, è come se legesse solo quello e l'ultimo elemento della lista rimane sempre quella, nn legge la riga successiva. non capisco.

ok risolto, in pratica il metodo insert inseriva gli elementi in testa, e io utilizzavo per leggere gli elementi il metodo last che li legge in coda, cambiato con il metodo head, e funziona tutto :)

Hardcore
5th September 2007, 12:31
Ok nuovo grande problema:

ho creato l'oggetto Libro che contiene i seguenti attribtu:

int Posizione;
char nome;
char Autore
char Editore


ora ho creato un pannello che mi crea un oggetto Libro e dei vari text field per completare appunto questi 4 attributi, la domanda è:
come faccio a salvare su un file tutto ciò, cioè a salvare su un file il nome del libro e di seguito i suoi attributi?

considerando che devo poi avere un cercatore che me li va a ricaricare e a un nome libro specifico devono corrispondere Autore Posizione ed Editore corretti non random. In c c'era un modo per far leggere da file delle Struct predefinite qua in java non trovo nulla di simile.