Pagina 3 di 3 primaprima 1 2 3
Visualizzazione dei risultati da 21 a 29 su 29
  1. #21
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da giuliocesare80
    codice:
            JPanel pannello = new JPanel();
            pannello.setLayout(new GridLayout(2,1));
            add(loadButton, GridLayout.NORTH);
            add(saveButton, GridLayout.NORTH);
            add(textButton, BorderLayout.SOUTH);
    No, qui è proprio sbagliato. Innanzitutto i vari NORTH, SOUTH ecc.. sono solo di BorderLayout che ha le 5 aree. Non esiste un NORTH di GridLayout!! GridLayout organizza una griglia ... non c'è nord, sud ecc...
    Come seconda cosa, hai creato un JPanel ma dentro non ci hai messo nulla e sua volta non l'hai messo dentro qualcosa. Solo istanziare un JPanel non vuol dire nulla ....

    Quindi vediamolo in singoli passi:

    A) Istanzi un JPanel e gli imposti un GridLayout di 2x1

    JPanel pannello = new JPanel();
    pannello.setLayout(new GridLayout(2,1));



    B) Aggiungi i pulsanti nel pannello

    pannello.add(loadButton);
    pannello.add(saveButton);


    Nota: 1) La add è fatta sul pannello, cioè i due pulsanti vengono messi "logicamente" nel pannello. 2) Dal punto di vista "fisico" si dispongono con l'ordine del GridLayout che in generale è sinistra->destra, alto->basso. Quindi loadButton sopra e saveButton sotto.
    3) Non c'è da passare un secondo argomento a add, non ci sono dei "constraints" (tradotto: sono i "vincoli", come invece es. BorderLayout.NORTH per un BorderLayout).


    C) Aggiungi il solo pannello da qualche altra parte, ad esempio in NORTH del BorderLayout del content pane:

    add(pannello, BorderLayout.NORTH);

    Originariamente inviato da giuliocesare80
    Intendevo che ho letto una serie in tutorial e ho seguito un po' i tuoi input, ma non riesco ad esempio a capire come usare la classe javax.imageio.ImageIO, ho trovato una serie di esempi che necessitano l'uso di try/catch che non capisco se mi siano utili o se non ci ho capito nulla io!!!
    Ti conviene mettere un metodo es. caricaImmagine() dentro FinestraPrincipale (ma non nelle inner-class) del tipo (codice abbozzato):

    codice:
    private void caricaImmagine() {
        int retVal = fc.showOpenDialog(this);
    
        if (retVal == JFileChooser.APPROVE_OPTION) {
            File fileSelezionato = fc.getSelectedFile();
    
            try {
                BufferedImage bufImg = ImageIO.read(fileSelezionato);
    
                // .....
            } catch (IOException e) {
    
                // Errore di I/O. Da gestire (es. mostra una box di errore)
            }
        }
    }
    Nota che a showOpenDialog ho passato this. Ora che caricaImmagine è direttamente in FinestraPrincipale ma non nella inner-class, allora il 'this' fa già da solo riferimento alla istanza di FinestraPrincipale corrente che è appunto il frame.

    Per usare File, ImageIO e BufferedImage devi importare:

    codice:
    import java.awt.image.*;
    import java.io.*;
    import javax.imageio.*;
    Nel actionPerformed() di LoadButtonListener metterai semplicemente la invocazione di caricaImmagine().

    In caricaImmagine ad un certo punto ottieni un BufferedImage. Cosa farne di questo .... beh, è tutto un altro discorso. Avevi detto che vuoi gestire più immagini contemporaneamente, quindi dovrai gestire un "insieme" (detto in generale) di immagini. Ma è comunque ancora tutto da stabilire (ti ricordi la mia risposta iniziale??)
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  2. #22
    Buonasera..
    Ho apportato le modifiche che mi hai dato per quanto riguarda i bottoni..ci ho smanettato un po' e ora l'interfaccia ha dei connotati adatti alle mie esigenze..e fin qui tutto bene.
    Poi sono passato alla fase successiva, ho inserito il codice che mi hai abbozzato, spero nel posto giusto, considerando il fatto che per me la inner-class è rappresentata dal codice racchiuso tra parentesi graffe (ma ovviamente non ne sono sicuro) e ho inserito un ritorno dell'eccezione dove mi hai scritto:
    // Errore di I/O. Da gestire (es. mostra una box di errore)
    con l'intenzione di far comparire un messaggio di errore (anche qui tutto da verificare).

    Nel actionPerformed() di LoadButtonListener metterai semplicemente la invocazione di caricaImmagine().
    Ho provato ad invocare caricaImmagine() come mi hai consigliato ma vedendo la serie di errori che mi trova direi che ho commesso l'ennesimo strafalcione!!
    Ma per invocare un metodo non devo mettere : oggetto.metodo ?


    In caricaImmagine ad un certo punto ottieni un BufferedImage. Cosa farne di questo .... beh, è tutto un altro discorso. Avevi detto che vuoi gestire più immagini contemporaneamente, quindi dovrai gestire un "insieme" (detto in generale) di immagini. Ma è comunque ancora tutto da stabilire (ti ricordi la mia risposta iniziale??)
    Rileggo continuamente le tue risposte in modo da capire se facendo qualche piccolo passo avanti, riesco ad interpretare meglio i consigli precedenti; come ad esempio nell'ultima risposta quando passo passo riesco a motivare il perchè del codice, e di come ogni cosa sia legata ad un'altra (ma capisco anche che non sia facile per te dilungarti troppo in spiegazioni semplificate e per questo ti ringrazio moltissimo).

    Per quanto riguarda i due metodi che mi hai accennato, le mie scarse conoscenze e il mio lento e disordinato apprendimento mi spingono ad utilizzare il metodo più semplice (ammesso che ci sia!!!) onde evitare di avventurarmi in strade per me difficili da percorrere..

    Ti allego il codice del mio stato attuale:

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.awt.image.*;
    import java.io.*;
    import javax.imageio.*;
    
    
    
    public class FinestraPrincipale extends JFrame {
        private JButton loadButton;
        private JButton saveButton;
        private JButton textButton;
    
    
        public FinestraPrincipale() {
            super("Finestra Principale");
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            setSize(500, 400);
    
    
            loadButton = new JButton("Apri");
            loadButton.setToolTipText("Importa Immagine");
            loadButton.addActionListener(new LoadButtonListener());
    
            saveButton = new JButton("Salva");
            saveButton.setToolTipText("Salva Immagine");
            saveButton.addActionListener(new SaveButtonListener());
    
            textButton = new JButton("Inserisci Nota");
            textButton.setToolTipText("Commenta Immagine");
            textButton.addActionListener(new TextButtonListener());
    
    
            JPanel pannello = new JPanel();
            pannello.setLayout(new GridLayout(1,2));
            pannello.add(loadButton);
            pannello.add(saveButton);
            add(pannello, BorderLayout.NORTH);
    
            add(textButton, BorderLayout.SOUTH);
    
    
            setVisible(true);
        }
    
        private final JFileChooser fc = new JFileChooser();
    
        private class LoadButtonListener implements ActionListener {
            public void actionPerformed(finestraPrincipale.caricaImmagine()) {
                int apriFinestra = fc.showOpenDialog(FinestraPrincipale.this); // apre finestra selezione file
            }
        }
    
        private class SaveButtonListener implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                int salvaFinestra = fc.showSaveDialog(FinestraPrincipale.this); // apre finestra salvataggio file
    
            }
        }
    
        private class TextButtonListener implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                // inserisce testo
            }
        }
    
        private void caricaImmagine() {
            int retVal = fc.showOpenDialog(this);
    
            if (retVal == JFileChooser.APPROVE_OPTION) {
                File fileSelezionato = fc.getSelectedFile();
    
                try {
                    BufferedImage bufImg = ImageIO.read(fileSelezionato);
    
                    // .....
                } catch (IOException e) {
                    System.out.println("Errore");// Errore di I/O. Da gestire (es. mostra una box di errore)
                }
            }
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new FinestraPrincipale();
                }
            } );
        }
    }
    Grazie e buonanotte..
    Sperando che la notte mi porti consiglio..

  3. #23
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da giuliocesare80
    per me la inner-class è rappresentata dal codice racchiuso tra parentesi graffe
    No, non sono le graffe in sé che contano!

    codice:
    class Esterna {
        class Interna {
        }
    }
    La classe Esterna non è dentro un'altra classe e per questo tipicamente viene definita "top-level". La classe Interna è fisicamente dichiarata dentro Esterna e non è marcata 'static'. Questo la rende una "inner-class", per la precisione una normale (o detta "regular") inner-class (per differenziarla dalle inner-class "anonime" e "locali", che sono altri 2 tipi).

    Quindi una inner class "normale" è una classe che è membro di un'altra classe e non è marcata static.

    Originariamente inviato da giuliocesare80
    ho inserito un ritorno dell'eccezione dove mi hai scritto:

    con l'intenzione di far comparire un messaggio di errore (anche qui tutto da verificare).
    Fare un System.out.println ovviamente è tecnicamente corretto. Ma in una applicazione "grafica" lanciata come si deve a livello reale, generalmente la "console" non si vede! E quindi non è molto appropriato, visto che il messaggio dovrebbe informare l'utente (e non uno sviluppatore).

    In Swing esiste la classe JOptionPane, che consente di mostrare le classiche dialog box di messaggi, eventualmente anche con l'apposita iconcina es. del triangolo, ecc....
    E usarla è molto semplice:

    codice:
    JOptionPane.showMessageDialog(this, "Errore di I/O durante il caricamento della immagine", "Errore", JOptionPane.ERROR_MESSAGE);
    Il 'this' è sempre il riferimento al tuo frame corrente, se metti questa riga dentro caricaImmagine().

    E con questa unica e semplice riga puoi mostrare una dialog di questo tipo (nota: l'aspetto della finestra e della icona dipendono dal Look&Feel impostato!):


    La invocazione di showMessageDialog è "bloccante", si esce da lì solo quando l'utente ha cliccato su OK.

    Originariamente inviato da giuliocesare80
    Ho provato ad invocare caricaImmagine() come mi hai consigliato ma vedendo la serie di errori che mi trova direi che ho commesso l'ennesimo strafalcione!!
    Ma per invocare un metodo non devo mettere : oggetto.metodo ?
    In generale sì ma in questo caso non serve l'oggetto!! Dai actionPerformed delle inner-class, il caricaImmagine() è "visibile" perchè è in "scope".

    Tu però hai messo:
    public void actionPerformed(finestraPrincipale.caricaImmagine( ))

    Semplicemente è sbagliato. Lì ci vuole il parametro ActionEvent e. La signature (la "firma") del metodo non la devi cambiare. Si chiama actionPerformed, ha ritorno void, ha 1 parametro di tipo ActionEvent. Basta, non devi toccare nulla di questo.

    Nel corpo del metodo invocherai caricaImmagine().

    codice:
    public void actionPerformed(ActionEvent e) {
        caricaImmagine();
    }
    Originariamente inviato da giuliocesare80
    Per quanto riguarda i due metodi che mi hai accennato, le mie scarse conoscenze e il mio lento e disordinato apprendimento mi spingono ad utilizzare il metodo più semplice (ammesso che ci sia!!!) onde evitare di avventurarmi in strade per me difficili da percorrere..
    Tra le due strade che avevo accennato, quella più semplice è usare componenti Swing per visualizzare le singole immagini. L'altra, ovvero un unico componente che "disegna" le immagini, è decisamente più complessa.

    Ma esiste una ulteriore soluzione, che non ho detto e che bisogna vedere se ti va bene. Faccio una premessa: hai presente quei software che hanno la finestra principale e poi dentro hanno finestre che contengono i singoli documenti? Questo è tipico ad esempio dei programmi di grafica o dei word processor.
    Queste applicazioni vengono definite MDI, "multiple document interface" e in Java si possono fare tramite l'uso di 2 componenti Swing: JDesktopPane e JInternalFrame.
    Vedi qui sul tutorial Sun dove mostra anche una immagine.

    Ti può andare bene? Il tuo obiettivo è proprio quello di poter gestire semplicemente "documenti" separati? Allora questa soluzione è molto valida e appropriata, anche perché il trascinamento dei frame interni è già implementato .... nelle due soluzioni che ho detto prima, sarebbe invece comunque a tuo carico!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #24
    Buongiorno..
    Ho letto ora la tua risposta..mi sembra tutto abbastanza chiaro..ho notato che commetto spesso errori banali, spero di migliorare nel tempo...nel pomeriggio ci lavoro.
    Per quanto riguarda la scelta del metodo da utilizzare per la visualizzazione delle immagini, ho fissato un ricevimento con il docente per Martedì 15 nel pomeriggio, almeno chiedo direttamente a lui che tipo di soluzione vuole che adotti.
    Mi studierò con attenzione i consigli che mi hai dato, così da poter essere più chiaro possibile nelle spiegazioni e di capire al meglio ciò che mi dirà.
    Per ora ti ringrazio e ti auguro un buon pomeriggio
    Grazie

  5. #25
    Buonasera..
    Oggi sono stato a ricevimento con il docente, mi ha detto che devo usare BufferedImage, Graphic 2D e DrawImage per la mia applicazione; la terza, in particolare, dovrebbe consentirmi tranquillamente di portare a termine il lavoro poichè completa di tutto ciò di cui ho bisogno.
    In più mi ha detto che non devo usare alcun tipo di filtro per la selezione/salvataggio dei file.
    Inizio ora ad approfondire la mia conoscenza sul "miracoloso" DrawImage..se hai qualche consiglio da darmi, sarei lieto di riceverli..
    Grazie in anticipo

  6. #26
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da giuliocesare80
    mi ha detto che devo usare BufferedImage, Graphic 2D e DrawImage per la mia applicazione

    se hai qualche consiglio da darmi, sarei lieto di riceverli..
    Mah ... a dire il vero non hai ancora precisato e chiarito (una volta per tutte ...) quale approccio di quelli che avevo citato io hai deciso (o ti è stato chiesto/imposto) di usare.

    Parlando di drawImage (nota: è un metodo di Graphics/Graphics2D !!) l'unica cosa chiara è che devi fare del "custom painting". Cioè non devi far disegnare la immagine ad un componente Swing già fatto (es. un JLabel che visualizza un ImageIcon che contiene il BufferedImage) ma devi realizzare un tuo componente (si tratta tipicamente di estendere JPanel o JComponent) in cui fai l'override di paintComponent() che tu implementi per disegnare sul Graphics/Graphics2D la immagine con drawImage().

    Ma questo dice comunque ancora poco!! Potresti avere 3 scenari:

    1) Hai 1 istanza di un tuo componente che disegna tutte le immagini. Ovviamente il tuo componente deve contenere le apposite strutture dati per mantenere queste informazioni. E deve gestire anche il trascinamento delle immagini.

    2) Hai N istanze di un tuo componente, ognuna disegna 1 immagine. E ognuna potrebbe gestire anche il trascinamento di sé stessa. Tutti questi componenti sono messi es. in un semplice JPanel che usa il posizionamento assoluto (nessun layout manager).

    3) Usi JDesktopPane/JInternalFrame, ogni JInternalFrame contiene 1 istanza di un tuo componente che disegna 1 immagine. Il trascinamento dei internal frame .... beh, ti andrebbe bene, è già automatico!

    Quindi????
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #27
    Mi spiace non essere chiaro, ma devo ancora ben capire quale sono le caratteristiche delle varie tipologie che posso utilizzare.

    3) Usi JDesktopPane/JInternalFrame, ogni JInternalFrame contiene 1 istanza di un tuo componente che disegna 1 immagine. Il trascinamento dei internal frame .... beh, ti andrebbe bene, è già automatico!
    Su questo metodo ho un dubbio: JInternalFrame crea un frame che ha in alto a destra i 3 bottoncini per ridurre ad icona, ingrandire e chiudere..o sbaglio?
    In questo caso scarterei questa strada poichè l'idea di tante finestre con tanto di bordo mi sembra inadatta.
    Il primo e il secondo caso mi sembrano più adatti (ammesso che permettano di importare le immagini con la semplice linea che inquadra l'immagine e che ci sia la possiabilità di usare l'handle); se non ho capito male sono più o meno simili.

    in cui fai l'override di paintComponent() che tu implementi per disegnare sul Graphics/Graphics2D la immagine con drawImage().
    Questa penso sia la strada che devo seguire, creare un componente..ma non mi è chiara la differenza dell'avere 1 o più istanze..è solo una questione di complessità del codice o restituiscono caratteristiche molto differenti?
    Grazie

  8. #28
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da giuliocesare80
    Su questo metodo ho un dubbio: JInternalFrame crea un frame che ha in alto a destra i 3 bottoncini per ridurre ad icona, ingrandire e chiudere..o sbaglio?
    In linea di massima sì. Ma tieni presente che la presenza di questi pulsantini è perfettamente configurabile!! Basta che guardi i costruttori di JInternalFrame.

    Originariamente inviato da giuliocesare80
    In questo caso scarterei questa strada poichè l'idea di tante finestre con tanto di bordo mi sembra inadatta.
    Beh, vedi tu. Le applicazioni "MDI" sono fatte così ma se non ti va bene .... ok.

    Originariamente inviato da giuliocesare80
    Il primo e il secondo caso mi sembrano più adatti (ammesso che permettano di importare le immagini con la semplice linea che inquadra l'immagine e che ci sia la possiabilità di usare l'handle); se non ho capito male sono più o meno simili.
    Non ho capito cosa intendi con "la semplice linea che inquadra l'immagine". Qui, in questi casi, disegni tu quello che vuoi, come vuoi. Non ci sono limiti ....

    Originariamente inviato da giuliocesare80
    ma non mi è chiara la differenza dell'avere 1 o più istanze..è solo una questione di complessità del codice o restituiscono caratteristiche molto differenti?
    La differenza l'avevo già spiegata.
    O fai un tuo componente sulla cui "superficie" grafica disegni tutte le immagini (quindi il componente sarà molto grande a video), ognuna alla sua locazione e ne gestisci il trascinamento oppure fai un tuo componente che è grande proprio solo come una immagine e disegna solo quella. Avrai quindi N istanze di questo tuo componente che metterai dentro un altro "contenitore" (es. JPanel) e anche qui gestisci il trascinamento.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #29
    Buonasera..
    La mia idea è quella di creare una sorta di schermata vuota di dimensioni sufficientemente grandi per poi importare le immagini, in formato ridotto, da poter gestire (ridimensionare e spostare) all'interno.

    O fai un tuo componente sulla cui "superficie" grafica disegni tutte le immagini (quindi il componente sarà molto grande a video), ognuna alla sua locazione e ne gestisci il trascinamento
    Questa soluzione mi sembra più adatta..


    Non ho capito cosa intendi con "la semplice linea che inquadra l'immagine".
    Intendevo la linea di contorno dell'immagine, senza che ci sia una finestra intorno.
    Per intenderci come viene visualizzata un'immagine quando viene aperta con un qualsiasi programma per la visualizzazione delle immagini (es. Photoshop).

    Spero di essere stato più chiaro questa volta..
    Grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.