Realizzazione di finestra

di il
43 risposte

Realizzazione di finestra

Salve a tutti il mio problema è quello di voler realizzare una finestra in java(usando neetbeens) che appare soltanto quando viene richiesta e che si posizione in un punto esatto dello schermo principale(vista principale) come posso fare?

43 Risposte

  • Re: Realizzazione di finestra

    Ciao, questo codice dovrebbe risolverti il problema:
    
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
    
    /**
     *
     * @author Luigi
     */
    public class Main extends JFrame implements ActionListener{
    
        Container contenitore;
        JButton Bottone;
        Finestra finestra = null;
    
        public Main()
            {
                super("prova");
                this.setSize(400, 400);
                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
               
                contenitore = this.getContentPane();
                contenitore.setLayout(new FlowLayout());//puoi mettere null e i componenti li posizioni manualmente
    
                Bottone = new JButton("Mostra");
                Bottone.addActionListener(this);
    
                contenitore.add(Bottone);
    
                finestra = new Finestra("Finestra 2");
                finestra.setLocation(50, 50);//posiziona la finestra nello schermo
                finestra.setSize(200, 200);
    
                this.setVisible(true);
            }
       
        public static void main(String[] args) {
    
            new Main();
        }
    
        public void actionPerformed(ActionEvent e) {//chiama la sub quando ammacchi il bottone
            if(e.getSource() == Bottone)
                {
                    if(finestra.isVisible())
                        {
                            finestra.setVisible(false);
                            Bottone.setText("Mostra");
                        }
                    else
                        {
                            finestra.setVisible(true);
                            Bottone.setText("Nascondi");
                        }
                }
        }
    
        private class Finestra extends JFrame
            {
                public Finestra(String Titolo)
                    {
                        super(Titolo);
                        this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); //non chiude l'aplicazione ma nasconde la finestra quando premi "X"
                        //qui ci metti tutto il codice che ti serve per creare la finestra
                    }
            }
    
    }
    
    questa applicazione ti mostra due finestre, una con un bottone ed una vuota; quella con il bottone ti permette di controllare la visibilità di quella vuota. Se hai dei dubbi chiedi.
  • Re: Realizzazione di finestra

    Quando vado a scrivere finestra finestra = null; netbeens mi chiede di creare una calsse finestra
  • Re: Realizzazione di finestra

    Devi scrivere Finestra finestra = null; (la prima "F" è maiuscola) ricordati che Java è case sensitive cioè fa distinzione fra maiuscole e minuscole.
    Se copi il codice preciso per come l'ho scritto stai tranquillo che su NetBeans ti funziona, dato che l'ho scritto con lui.
    Quello che ho fatto è creare una classe ed estenderla con la classe JFrame che è quella che si occupa di gestire la finestra. Se non lo sai questa è la tanto famosa ereditarietà.
    La finestra dove c'è il bottone la creo tramite la classe Main. Il codice è semplice, ti mostra le basi per creare una finestra e metterci quello che vuoi, in più gestisco l'evento del bottone che si può fare in altri modi implementando altri tipi di interfacce.
  • Re: Realizzazione di finestra

    Innanzitutto ciao a tutti!!
    Il mio problema è il seguente:
    Dopo aver creato in java diverse classi dove in ogni classe ho creato delle jframe (che contengono un jpanel che a sua volta contiene diversi componenti), mi sono reso conto che ho bisogno le jdialog perche mi servono delle finestre modali.
    Per capirci, ho una finestra principale con login e password e tra gli altri anche il pulsante REGISTRATI...io vorrei che quando premo su registrati appaia una finestra modale in modo da non poter ritornare alla finestra del login fin quando non viene chiusa questa seconda.
    Il problema è che io ho gia creato tutte le Jframe e quindi se dovessi usare le jdialog dovrei rifare tutto oppure posso "trasformare" una jframe o un jpanel in una jdialog o renderlo semplicemente modale?
    Grazie in anticipo della risposta
    CLA
  • Re: Realizzazione di finestra

    Ok se devi trasformare una classe che usa JFrame, in JDialog non dovresti avere grossi problemi, infatti i metodi sono molto simili, cambiano però i parametri del costruttore.
    Guarda l'esempio di codice:
    
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
    
    /**
     *
     * @author Luigi
     */
    public class Main extends JFrame implements ActionListener{
    
        Container contenitore;
        JButton Bottone;
        Finestra finestra = null;
    
        public Main()
            {
                super("prova");
                this.setSize(400, 400);
                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
               
                contenitore = this.getContentPane();
                contenitore.setLayout(new FlowLayout());
                Bottone = new JButton("Mostra");
                Bottone.addActionListener(this);
    
                contenitore.add(Bottone);
    
                finestra = new Finestra("Finestra 2", this.getOwner());
                finestra.setLocation(50, 50);//posiziona la finestra nello schermo
                finestra.setSize(200, 200);
    
                this.setVisible(true);
            }
       
        public static void main(String[] args) {
            new Main();
        }
    
        public void actionPerformed(ActionEvent e) {
            if(e.getSource() == Bottone)
                {
                    System.out.println("prima di setVisible");
                    finestra.setVisible(true);
                    System.out.println("dopo di setVisible");
                }
        }
    
        private class Finestra extends JDialog
            {
                public Finestra(String Titolo, Window padre)
                    {
                        super(padre, Titolo, ModalityType.APPLICATION_MODAL);
                        this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); //non chiude l'aplicazione ma nasconde la finestra quando premi "X"
                        //qui ci metti tutto il codice che ti serve per creare la finestra
                    }
            }
    
    }
    
    questo codice genere una finestra con un bottone che ti permette di controllare il JDialog (classe Finestra). Quando il JDialog diventa visibile questo blocca la finestra padre (in questo caso la classe Main), però questo succede perché il ModalityType è ModalityType.APPLICATION_MODAL puoi anche metterlo in modo che non blocchi la finestra padre.
    Quando il JDialog diventa visibile blocca anche l'esecuzione del codice, infatti come puoi vedere ho messo dei println() prima e dopo l'istruzione setVisible(true) (metodo actionPerformed) relativa al JDialog.
    Come puoi notare non appena il JDialog diventa visibile le istruzioni prima di setVisible(true) vengono eseguite, quelle dopo no, per eseguirle devi chiudere il JDialog, cioè mettere setVisible(false).
    Spero di essere stato chiaro.
  • Re: Realizzazione di finestra

    Grazie mille....
    Posso chiederti un'altra cosa? Vorrei che la JDialog non avesse le iconcine in alto a destra come tutte le finestre(ingrandimento,riduci a icona e X) ma voglio poterla chiudere solo dal pulsante annulla.
    E poi, dato che è una jdialog "registrazione utente" quindi con tanti campi da compilare, vorrei poter mettere un pulsante "resetta campi".
    Per far ciò non c'è un metodo piu veloce che scrivere setText("") in ogni campo una volta verificatosi l'evento della pressione del suddetto pulsante?
    Grazie ancora!
  • Re: Realizzazione di finestra

    Allora per far scomparire i bottoni della finestra vedi il codice.
    
    private class Finestra extends JDialog implements ActionListener
            {
                JButton BottoneConferma = null;
                JPanel Pannello = null;
                Container contenitore = null;
                public Finestra(String Titolo, Window padre)
                    {
                        super(padre, Titolo, ModalityType.APPLICATION_MODAL);
                        this.setResizable(false);
                        this.setUndecorated(true);//nasconde i bottoni
    
                        this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); //non chiude l'aplicazione ma nasconde la finestra quando premi "X"
    
                        contenitore = this.getContentPane();
                        contenitore.setLayout(new BorderLayout());
    
                        Pannello = new JPanel(new FlowLayout());//ho messo il pannello per farti vedere meglio la finestra dato che il pannello è di colore rosso
                        Pannello.setBackground(new Color(255,0,0));
                        contenitore.add(Pannello);
    
                        BottoneConferma = new JButton("OK");
                        BottoneConferma.addActionListener(this);
                        Pannello.add(BottoneConferma);
                    }
    
               public void actionPerformed(ActionEvent e)
                    {
                        if(e.getSource() == BottoneConferma)
                            {
                                //gestisci tutti i campi prendendo i valori prima di setVisible(false)
                                this.setVisible(false);
                            }
                    }
            }
    
    Il JDialog viene messo con Undecorated e questo fa si che la barra del titolo non viene mostrata, però in questo modo non c'è il titolo della finestra e non puoi spostarla.
    Se devi mettere il titolo e spostare la finestra devi implementarlo tu, utilizzando le interfacce che si occupano di gestire i movimenti del mouse.
    Per quanto riguarda il reset dei campi, devi farlo a mano che io sappia, uno ad uno devi mettere il valore, per farlo veloce potresti scrivere:
    
    JTextArea Caselle[] = new JTextArea[10]; //array di caselle
    
    for(int Indice = 0; Indice < Caselle.length; Indice++)
       {
            Caselle[Indice].setText("");
       }
    
  • Re: Realizzazione di finestra

    Ho una Jdialog dove devo inserire i dati di un utente per registrare l'utente, quindi al clic del pulsante REGISTRATI tutti i campi devono essere passati come parametri a un metodo di una classe server che a sua volta si connetterà col db per memorizzarli.
    Tra questi campi c'è il campo data di nascita che ho implementato in questo modo:

    JSpinner Spinnerdate = new javax.swing.JSpinner();
    Spinnerdate.setModel(new javax.swing.SpinnerDateModel(new java.util.Date(), new java.util.Date(-2208918900000L), new java.util.Date(),
    java.util.Calendar.DAY_OF_WEEK));
    Spinnerdate.setEditor(new JSpinner.DateEditor(Spinnerdate, pattern));

    Io vorrei prelevare il contenuto di questo campo come tipo Date quando si preme il pulsante REGISTRATI in modo che come parametro viene passato un tipo Date, in modo tale da poter in seguito usare i metodi della classe Date ad esempio per confrontare 2 date (se non sbaglio col metodo, "compareTo" o qualcosa di simile.
    Grazie a chi mi risponderà!!
  • Re: Realizzazione di finestra

    Allora per fare quello che vuoi ho controllato la documentazione Java, per vederla vai qui
    ti metto il pezzo di codice che può interessarti: (vedi dopo il codice il pezzo che ti serve)
    
    public class SpinnerDemo3 extends JPanel
                              implements ChangeListener {
        protected Calendar calendar;
        protected JSpinner dateSpinner;
        ...
        public SpinnerDemo3() {
            ...
            SpinnerDateModel dateModel = ...;
            ...
            setSeasonalColor(dateModel.getDate()); //initialize color
    
            //Listen for changes on the date spinner.
            dateSpinner.addChangeListener(this);
            ...
        }
    
        public void stateChanged(ChangeEvent e) {
            SpinnerModel dateModel = dateSpinner.getModel();
            if (dateModel instanceof SpinnerDateModel) {
                setSeasonalColor(((SpinnerDateModel)dateModel).getDate());//QUESTO E' QUELLO CHE TI INTERESSA RISPETTA LE PARENTESI, NATURALMENTE TOGLI QUELLE RELATIVE ALLA CHIAMATA DEL METODO
            }
        }
    
        protected void setSeasonalColor(Date date) {
            calendar.setTime(date);
            int month = calendar.get(Calendar.MONTH);
            JFormattedTextField ftf = getTextField(dateSpinner);
            if (ftf == null) return;
    
            //Set the color to match northern hemisphere seasonal conventions.
            switch (month) {
                case 2:  //March
                case 3:  //April
                case 4:  //May
                         ftf.setForeground(SPRING_COLOR);
                         break;
                ...
                default: //December, January, February
                         ftf.setForeground(WINTER_COLOR);
            }
        }
        ...
    }
    
    
    SpinnerModel dateModel = dateSpinner.getModel();
    if (dateModel instanceof SpinnerDateModel){
    setSeasonalColor(((SpinnerDateModel)dateModel).getDate());
    }
  • Re: Realizzazione di finestra

    Ho 2 variabili di tipo Date con questo formato
    Tue Jan 01 03:23:00 CET 1980
    Wed Jun 23 23:27:29 CEST 2010
    e dovrei calcolare l'età di una persona.
    Ci sono metodi che prendono 2 Date (data di nascita e data odierna) e calcolano l'età di una persona?

    L'unica cosa che ho trovato è convertire sia la data di nascita che la data odierna in un Long che rappresenta i millisecondi che sono passati dal 1/01/1970 ma ciò vuol dire che se metto come data di nascita una data precedente a quest'ultima, i millisecondi diventano negativi e sballa tutto.
    Credo che sia una domanda abbastanza semplice perchè in molti avranno avuto bisogno di questi metodi
    Grazie anticipatamente
  • Re: Realizzazione di finestra

    Nessuno sa come fare? Pensavo fosse una cosa semplice
  • Re: Realizzazione di finestra

    Scusa se non ti ho risposto subito ma era da qualche giorno che non mi collegavo al forum, per fare quello che dici fatti una classe "data" e ti fai i calcoli che ti servono, qualche tempo fa dovevo usare delle date ma come te ho avuto problemi con questi cavolo di millisecondi, esempio:
    
    public class Data
    {
    public int Giorno = 1;
    public int Mese = 1;
    public int Anno = 1;
    public Data(int Giorno, int Mese, int Anno)
    {
    if(Giorno >= 1 && Giorno <= 31)
    this.Giorno = Giorno;
    else
    //fai partire eccezione
    
    if(Mese >= 1 && Mese <= 12)
    this.Mese = Mese;
    else
    //fai partire eccezione
    
    if(Anno >= 1900 && Anno <= 2200) //messa per sicurezza la seconda espressione  
    this.Anno = Anno;
    else
    //fai partire eccezione
    }
    
    public int CalcolaEtà(Data DataConfronto)
    {
    int età = Anno - DataConfronto.DammiAnno();
    return Math.abs(età);//non mi ricordo se è giusto il nome del metodo
    }
    
    public int DammiAnno()
    {
    return Anno;
    }
    
    public int DammiMese()
    {
    return Mese;
    }
    
    public int DammiGiorno()
    {
    return Giorno;
    }
    }
    
    Naturalmente puoi aggiungere tutti i metodi che ti servono.
  • Re: Realizzazione di finestra

    Grazie mille delle risposte esaurienti e celeri
    Sto ancora lavorando al mio progetto e avrei bisogno di fare una cosa alquanto complicata per me.
    In pratica vorrei avere 2 campi di testo(che conteranno ognuno il punteggio di ogni giocatore) e avere un pulsante, premuto il quale faccia "girare" i numeri nei campi di testo (un po' come le roulette del casino) e poi si fermi visualizzando un punteggio tra 1 e 90.
    Spero che qualcuno sia così gentile da rispondermi nonostante è il 9 agosto e tutti (o quasi) sono in vacanza!!
    Grazie in anticipo...
  • Re: Realizzazione di finestra

    Nel codice che ti ho messo creo una finestra e metto un bottone ed un JTexArea premendo il bottone vengono mostrati i numeri random nella casella:
    
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.lang.Thread.State;
    import javax.swing.*;
    
    /**
     *
     * @author Luigi
     */
    public class Main extends JFrame implements ActionListener{
    
        Container contenitore;
        JButton Bottone;
        JTextArea TextArea = null;
        NumeriCasella numeriCasella = null;
        boolean ThreadPartito = false;
    
        public Main()
            {
                super("prova");
                this.setSize(400, 400);
                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              
                this.addWindowListener(this);
    
                contenitore = this.getContentPane();
                contenitore.setLayout(new FlowLayout());
    
                Bottone = new JButton("Avvia");
                Bottone.addActionListener(this);
    
                contenitore.add(Bottone);
    
                TextArea = new JTextArea();
                TextArea.setColumns(1);
                TextArea.setRows(1);
                TextArea.setSize(50, 15);
    
                contenitore.add(TextArea);
    
                numeriCasella = new NumeriCasella(90, 50, TextArea);
    
                this.setVisible(true);
    
            }
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            new Main();
        }
    
        public void actionPerformed(ActionEvent e) {
            if(e.getSource() == Bottone)
                {
                    if(!ThreadPartito)
                        {
    
                            if(numeriCasella.getState() != State.TIMED_WAITING)
                                numeriCasella.start();
                            else
                                numeriCasella.resume();
    
                            ThreadPartito = true;
                        }
                    else
                        {
                            numeriCasella.suspend();
                            ThreadPartito = false;
       
                        }
                }
        }
    
     public class NumeriCasella extends Thread
            {
                private int NumeroMassimoRandom = 0;
                private int NumeroRandom = 0;
                private int Millisecondi = 0;
                private JTextArea TextArea = null;
    
                public NumeriCasella(int ContaA, int MillisecondiPausa, JTextArea TA)
                    {
                        NumeroMassimoRandom = ContaA;
                        Millisecondi = MillisecondiPausa;
                        TextArea = TA;
                    }
    
                public void run()
                    {
                        while(true)
                            {
                                do
                                {
                                    NumeroRandom = (int) (Math.random() * NumeroMassimoRandom);
                                }while(NumeroRandom == 0);
    
                                TextArea.setText(Integer.toString(NumeroRandom));
                                TextArea.repaint();
                                
                                try
                                    {
                                        Thread.sleep(Millisecondi);
                                    }
                                catch (InterruptedException ex) {}
                            }
                    }
    
            }
    
    }
    
Devi accedere o registrarti per scrivere nel forum
43 risposte