Ciao a tutti !
è la prima volta che scrivo su questo forum ed è da poco sto "lottando" con Java ..
Il mio progetto è quello di fare un'applicazione capace di gestire il mio archivio di fotografie. Sono già riuscito a fare tutto in HTML ma volevo passare a JAVA per non avere limitazioni nell'accesso a file locali (su un disco esterno).
Tutti i dati vengono presi da un Database in Ms Access, dove c'è una Tabella "Base" con campi tipo ("Album","Anno","Mese","Luogo" e un campo "Link" dove c'è il link alla directory locale dove stanno fisicamente i files).
Il mio programma Java dovrebbe collegarsi al database, estrarre i dati (in base a una query) e "costruire" una finestra con una serie di anteprime. Per ogni album vine costruito uno spazio quadrato (su JPanel) contente il titolo, un'immagine copertina, l'anno e il mese.
Cliccando sul titolo di ogni album vorrei riuscire ad aprire la directory locale dove stanno i files con le foto.
Io ho usato un FlowLayout e ho creato un array di Jpanel (ogni Jpanel ha un box-layout verticale contenente una JLabel per il titolo, una JLabel con l'immagine copertina e una terza JLabel con la data e il luogo).
In pratica riesco a collegarmi al database, riesco a filtrare gli album in base a una query (per ora è fissa .. poi dovrò svilupparla), scorro tutto il RecordSet e per ogni record costruisco il suo JPanel e le sottostanti JLabel. Fin qui tutto bene ... (ed è già un miracolo).
Quello che non riesco a fare è fare in modo che cliccando su una JLabel contenente il titolo o la copertina di un album mi si apra la finestra di windows con la directory dove sono i file.
Utilizzando il metodo mousePressed(MouseEvent e) riesco al massimo a ricavare il testo della JLabel su cui ho cliccato ((JLabel)(e.getSource())).getText() ma non riesco a ricavare la stringa "link" che mi serve per aprire la directory (questo perchè il ResulSet è ormai chiuso). Non voglio creare una JLabel con il link per ovvi motivi estetici !
Come potrei fare ???
inoltre .. sono molto graditi consigli sulla filosofia di programmazione di questa applicazione: non ho mai usato linguaggi di programmazione ad oggetti .. infatti c'è solo una classe con tutto il codice in un solo metodo ..
Grazie a tutti in anticipo !
Vi posto il codice.
Matteo
codice:import java.awt.event.*; import javax.swing.*; import java.awt.*; import java.sql.*; import javax.swing.border.*; public class ArchivioFoto { private JFrame window; private JLabel titolo; private JLabel sottotitolo; //-------------costruttore -------------------------------- public ArchivioFoto() { window = new JFrame("Java"); titolo = new JLabel("ARCHIVIO FOTO"); sottotitolo = new JLabel("sottotitolo"); } //-------------setup--------------------------------------- public void setup() { window.setSize(640, 480); window.setLocationRelativeTo(null); //mette la finestra al centro window.setExtendedState(JFrame.MAXIMIZED_BOTH); window.setVisible(true); window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); //------------------------------------ NORD--------------------------------- JPanel contenitoreAlto = new JPanel(new FlowLayout(FlowLayout.CENTER)); contenitoreAlto.setBackground(Color.yellow); contenitoreAlto.setPreferredSize(new Dimension(0,80)); Border blackline = BorderFactory.createLineBorder(Color.black); contenitoreAlto.setBorder(blackline); contenitoreAlto.add(titolo); contenitoreAlto.add(sottotitolo); window.add(contenitoreAlto, BorderLayout.NORTH); //-------------------------------- WEST------------------------------------ JPanel contenitoreSn = new JPanel(new FlowLayout(FlowLayout.LEFT)); contenitoreSn.setBackground(Color.red); contenitoreSn.setBorder(blackline); window.add(contenitoreSn, BorderLayout.WEST); //------------------------ CENTER------------------------------------------ JPanel contenitoreCentro = new JPanel(new FlowLayout(FlowLayout.LEFT)); contenitoreCentro.setBorder(blackline); Border redline = BorderFactory.createLineBorder(Color.red); final String Driver = "sun.jdbc.odbc.JdbcOdbcDriver"; final String Percorso = "C:\\"; final String MyDataBase = "Foto.mdb"; final String Url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=" + Percorso + MyDataBase; Connection con; try{ Class.forName(Driver); con = DriverManager.getConnection(Url); Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet rs; rs = stmt.executeQuery("SELECT * FROM Base WHERE Dove like'%Germania%' ORDER BY Data"); //query di prova rs.last(); int totAlbum = rs.getRow(); //calcola il totale di album filtrati sottotitolo.setText(" Album filtrati: " + totAlbum + "."); rs.beforeFirst(); JPanel[] panels = new JPanel[totAlbum]; JLabel[] titoli = new JLabel[totAlbum]; JLabel[] copertine = new JLabel[totAlbum]; Icon[] icone = new ImageIcon[totAlbum]; JLabel[] date = new JLabel[totAlbum]; rs.beforeFirst(); int counter = 0; while ( rs.next() ) { String album = rs.getString("Album"); String tipo = rs.getString("Tipo"); String anno = rs.getString("Anno"); String mese = rs.getString("Mese"); String link = rs.getString("Link"); String geoloc = rs.getString("GeoLoc"); panels[counter] = new JPanel(); panels[counter].setPreferredSize(new Dimension(170,150)); BoxLayout layout = new BoxLayout(panels[counter], BoxLayout.Y_AXIS); panels[counter].setLayout(layout); titoli[counter] = new JLabel(); titoli[counter].setText(album); icone[counter] = new ImageIcon("E://"+anno+"/"+link+"/data/copertina.jpg"); copertine[counter] = new JLabel(icone[counter]); date[counter] = new JLabel(); date[counter].setText(mese + " " + anno + " Tipo: " + tipo + " GL: "+geoloc); //---------------------- qui iniziano i problemi ............. titoli[counter].addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { sottotitolo.setText("mouse pressssed by " + ((JLabel)(e.getSource())).getText()); } } ); //---------------------- Layout titoli[counter].setAlignmentX(Component.CENTER_ALIGNMENT); copertine[counter].setAlignmentX(Component.CENTER_ALIGNMENT); date[counter].setAlignmentX(Component.CENTER_ALIGNMENT); panels[counter].add(titoli[counter]); panels[counter].add(copertine[counter]); panels[counter].add(date[counter]); panels[counter].setBorder(redline); contenitoreCentro.add(panels[counter]); counter++; }// end while con.close(); }//end try catch(ClassNotFoundException e){ System.out.println(e.toString()); } catch(SQLException e){ System.out.println(e.toString()); } window.add(contenitoreCentro, BorderLayout.CENTER); }//end setup public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { ArchivioFoto myApp = new ArchivioFoto(); myApp.setup(); } }); } }


Rispondi quotando