Realizzazione di finestra

di il
43 risposte

43 Risposte - Pagina 2

  • Re: Realizzazione di finestra

    Grazie mille...risposta esaurientissima!!!:D
  • Re: Realizzazione di finestra

    Avendo una classe di questo tipo che mi permette di disegnare col mouse su un pannello, potrei trasformarla in modo da disegnare NON una linea o comunqueun tratto sottile ma di disegnare un'immagine?
    Cioè vorrei che la mia immagine(ad esempio una palla da biliardo) venisse disegnata (anche lasciando premuto e trascinando il mouse) nel pannello piu volte.
    import javax.swing.*;
    import java.awt.*;
    import java.awt.Color.*;
    import java.awt.event.*;
    
    public class Painter extends JPanel {
      private int startXPoint = 0;  // coordinata x di partenza
      private int endXPoint = 0;    // coordinata x di arrivo
      private int startYPoint = 0;  // coordinata y di partenza
      private int endYPoint = 0;    // coordinata y di arrivo
      private boolean paint = false;
    
      // ascoltatore del moto del mouse
      class mMotionListener implements MouseMotionListener {
        public void mouseDragged(MouseEvent e) {
          // aggiorna le coordinate
          startXPoint = endXPoint;
          startYPoint = endYPoint;
          endXPoint = e.getX();
          endYPoint = e.getY();
          // disegna
          Painter.this.repaint();
        }
        public void mouseMoved(MouseEvent e) {
          // aggiorna le coordinate
          startXPoint = endXPoint;
          startYPoint = endYPoint;
          endXPoint = e.getX();
          endYPoint = e.getY(); 
        }
      }
      // ascoltatore dei pulsanti del mouse
      class mListener implements MouseListener {
        // i seguenti metodi sono richiesti dalla
        // interfaccia MouseListener anche se non
        // vengono utilizzati 
        public void mouseClicked(MouseEvent e) {}
        public void mouseEntered(MouseEvent e) {}
        public void mouseExited(MouseEvent e)  {}
    
        // pulsante premuto
        public void mousePressed(MouseEvent e) {
          // attiva la modalita' di disegno
          paint = true; 
        }
        // pulsante rilasciato
        public void mouseReleased(MouseEvent e) {
          // disattiva la modalita' di disegno
          paint = false;
        }
      }
      // Costruttore della classe principale
      public Painter() {
        super();
        MouseListener ml = new mListener();
        addMouseListener(ml);
        MouseMotionListener mml = new mMotionListener();
        addMouseMotionListener(mml);
      }
      public void paint(Graphics g) {
        // se e' attiva la modalita' di disegno, traccia una riga
        if(paint)
          g.drawLine(startXPoint,startYPoint,endXPoint,endYPoint);
      }
     public static void main(String argv[]) {
        Painter p = new Painter();
        JFrame f = new JFrame("Painter");
        f.getContentPane().add(p);
        f.setSize(400,300);
        f.setVisible(true);
     }
    }  
  • Re: Realizzazione di finestra

    Non ho capito cosa vuoi fare, spiegati meglio che cerco di aiutarti, da quello che si capisce devi disegnare una palla che si muove quando muovi il mouse? La palla va posizionata dove è il cursore?
  • Re: Realizzazione di finestra

    Quello che vorrei fare è la seguente cosa:

    quando clicco col mouse sul pannello appare una palla da biliardo quindi posso disegnare tante palle ogni volta che clicco sul pannello e in piu devo poter cliccare col mouse su un punto del pannello e senza rilasciare il mouse trascinarlo(il mouse) su un altro punto e mi dovrebbe disegnare tante palline una dopo l'altra un po' sovrapposte. Non so se ora è chiaro.
  • Re: Realizzazione di finestra

    Ti ho scritto l'applicazione che ti fa quello che mi hai richiesto, se clicco sul pannello mi disegna una palla, se premo il tasto sinistro del mouse e non rilascio (trascino) disegna tante palle ad una certa distanza modificabile (modifica la costante DISTANZA_PALLA).
    
    import java.awt.*;
    import java.awt.event.*;
    import java.net.URL;
    import java.util.*;
    import javax.swing.*;
    
    /**
     *
     * @author Luigi
     */
    public class Main extends JFrame implements MouseMotionListener, MouseListener{
    
        Container contenitore;
        boolean PrendiClick = true;
        boolean AbilitaTrascina = true;
    
        Image Immagine = null;
        ArrayList<Palla> ListaPalle = new ArrayList();
    
        private final int DISTANZA_PALLA = 32;
        private Point CoordinataPallaPrecedente = new Point(0, 0);
    
        public Main()
            {
                super("prova");
                this.setSize(400, 400);
                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       
                contenitore = this.getContentPane();
                contenitore.setLayout(null);
    
                URL url = this.getClass().getResource("Palla1P.png");
                ImageIcon i = new ImageIcon(url);
                Immagine = i.getImage();
    
                Pannello pannello = new Pannello(ListaPalle);
                pannello.setSize(350, 350);
                pannello.setLocation(0, 0);
                pannello.addMouseListener(this);
                pannello.addMouseMotionListener(this);
                contenitore.add(pannello);
    
                this.setVisible(true);
    
    
            }
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            new Main();
    
        }
    
    public void mouseDragged(MouseEvent e) {
            if(PrendiClick && AbilitaTrascina)
                {
                    int DifferenzaX = (int) Math.abs(CoordinataPallaPrecedente.getX() - e.getX());
                    int DifferenzaY = (int) Math.abs(CoordinataPallaPrecedente.getY() - e.getY());
    
                    if(DifferenzaX >= DISTANZA_PALLA || DifferenzaY >= DISTANZA_PALLA)
                        {
                            ListaPalle.add(new Palla(Immagine, e.getX(), e.getY()));
                            CoordinataPallaPrecedente.setLocation(e.getX(), e.getY());
                            contenitore.repaint();
                        }
                }
        }
    
        public void mouseMoved(MouseEvent e) {
    
        }
    
        public void mouseClicked(MouseEvent e) {
            if(PrendiClick && e.getButton() == MouseEvent.BUTTON1)
                {
                    ListaPalle.add(new Palla(Immagine, e.getX(), e.getY()));
                    CoordinataPallaPrecedente.setLocation(e.getX(), e.getY());
                    contenitore.repaint();
                }
        }
    
        public void mousePressed(MouseEvent e) {
            if(PrendiClick && e.getButton() == MouseEvent.BUTTON1)
                AbilitaTrascina = true;
            else
                AbilitaTrascina = false;
        }
    
        public void mouseReleased(MouseEvent e) {
    
        }
    
        public void mouseEntered(MouseEvent e) {
            PrendiClick = true;
        }
    
        public void mouseExited(MouseEvent e) {
            PrendiClick = false;
        }
    
    public class Pannello extends JPanel
            {
                ArrayList<Palla> ListaPalle;
    
                public Pannello(ArrayList<Palla> ListaPalle)
                    {
                        super();
                        this.ListaPalle = ListaPalle;
                    }
    
                public void update(Graphics g)
                    {
                        super.paintComponent(g);
                    }
    
                public void paintComponent(Graphics g)
                    {
                        if(ListaPalle.isEmpty() == false)
                            {
                                for(int IndicePalla = 0; IndicePalla < ListaPalle.size(); IndicePalla++)
                                    {
                                        g.drawImage(ListaPalle.get(IndicePalla).DammiImmagine(), ListaPalle.get(IndicePalla).DammiX(), ListaPalle.get(IndicePalla).DammiY(), null);
                                    }
                            }
    
                    }
    
    
            }
    
        public class Palla
            {
                private Image Immagine = null;
                private int CoordinataX = 0;
                private int CoordinataY = 0;
    
                public Palla(Image Immagine, int X, int Y)
                    {
                        this.Immagine = Immagine;
                        CoordinataX = X;
                        CoordinataY = Y;
                    }
    
                public Image DammiImmagine()
                    {
                        return Immagine;
                    }
    
                public int DammiX()
                    {
                        return CoordinataX;
                    }
    
                public int DammiY()
                    {
                        return CoordinataY;
                    }
            }
    
    
    }
    
    Era questo quello che intendevi?
  • Re: Realizzazione di finestra

    Sì, ti ringrazio molto!!
  • Re: Realizzazione di finestra

    Mi servirebbe un ulteriore favore
    Ho una jdialog con sopra un pannello che contiene vari componenti tra cui 2 Jcombobox di cui una contiene la lista delle regioni e l'altra è vuota
    Io vorrei che, selezionando una regione, l'altra combobox(quella delle citta) venisse caricata con le sole citta di quella regione(o al massimo solo le province)
    Credo si chiama jcombobox a cascata.
    Grazie in anticipo della risposta.
  • Re: Realizzazione di finestra

    Questa volta ho risolto da solo.
    Se dovesse servire a qualcuno ho semplicemente associato un ascoltatore alla comboboxRegioni e ogni volta che si seleziona una voce viene messo in una stringa il nome della voce.
    Poi ho creato 20 file per le 20 regioni e in ogni file ci sono le province di quella regione specifica.
    A seconda della voce che viene selezionata nella combobox che contiene la lista delle 20 regioni, viene caricato il file appropriato e viene letta riga per riga ogni città aggiungendola di volta in volta nella comboboxcitta.

    In parole povere il pezzo di codice è il seguente
    private void ComboBoxRegioniActionPerformed(java.awt.event.ActionEvent evt) {
    
            String regione=(String)ComboBoxRegioni.getSelectedItem();
            try{
                riempiCitta(regione);
            }
            catch(Exception e){e.printStackTrace();}
        }
    
    private void riempiCitta(String regione) throws Exception
        {
            cittaselezionata=(String)ComboBoxCitta.getSelectedItem();
            if(JtStringUtilities.isNotEmpty(cittaselezionata))
                ComboBoxCitta.removeAllItems();
            file = new FileReader("./file/"+regione);
            in = new BufferedReader(file);
            citta=in.readLine();
            while(citta != null)
            {
                ComboBoxCitta.addItem(citta);
                citta=in.readLine();
            }
            file.close();
        }
    Se ci fossero errori o si può fare di meglio basta dirlo
  • Re: Realizzazione di finestra

    Dovrei inserire in un pannello uno jspinner che abbia come min la data odierna e come max una data futura del genere 10 anni avanti.
    Le prove che ho fatto sono le seguenti:

    A parte la parte grafica che faccio con netbeans in modo automatico, le righe di codice sono:
    
    pattern= ((SimpleDateFormat)DateFormat.getDateInstance()).toPattern();   //pattern è una string
    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));
    
    Così funziona ma il min è 1900 e il massimo è la data odierna e il valore che appare all'inizio è la data odierna (questo mi è servito per il campo DATADINASCITA)
    Poi, ho provato a fare questo
    Spinnerdate.setModel(new javax.swing.SpinnerDateModel(new java.util.Date(), new java.util.Date(), new java.util.Date(120,7,30),java.util.Calendar.DAY_OF_WEEK));
    
    Ma il risultato è uno jspinner che visualizza la data odierna ma cliccando sulle freccette non cambia il valore
    Spero che qualcuno sappia come risolvere questo problema altrimenti non posso andare avanti
  • Re: Realizzazione di finestra

    Nei tutorial Java c'è quello che ti serve, vai in questa pagina:

    http://download.oracle.com/javase/tutorial/uiswing/components/spinner.html

    il codice che ti interessa lo trovi in questa pagina, leggi attentamente il costruttore:

    http://download.oracle.com/javase/tutorial/uiswing/examples/components/SpinnerDemoProject/src/components/SpinnerDemo.java

    ecco un estratto del costruttore:
    
            //Add the third label-spinner pair.
            Date initDate = calendar.getTime();
            calendar.add(Calendar.YEAR, -100);
            Date earliestDate = calendar.getTime();
            calendar.add(Calendar.YEAR, 200);
            Date latestDate = calendar.getTime();
            SpinnerModel dateModel = new SpinnerDateModel(initDate,
                                         earliestDate,
                                         latestDate,
                                         Calendar.YEAR);//ignored for user input
            spinner = addLabeledSpinner(this, labels[2], dateModel);
            spinner.setEditor(new JSpinner.DateEditor(spinner, "MM/yyyy"));
    
    
    L'esempio fatto nel tutorial dovrebbe bastarti.
  • Re: Realizzazione di finestra

    Mi sevirebbe un altro favore...
    Ho un jframe con 2 campi di testo (login e password) e un pulsante "entra", vorrei che quando viene premuto il pulsante appaia la JprogressBar che cominci a caricare e solo quando arriva al 100% continua il codice e viene visualizzata un'altra finestra.
    Il mio problema è che se chiamo la jprogressbar in un nuovo thread(come ho letto spesso nei forum) questo "codice" viene eseguito, ma "contemporaneamente" continua il codice del prg e quindi appare subito l'altra finestra(prima che arrivi al 100%).
    Se metto qualcosa tipo thread.sleep(2000) non si vede il caricamento della jprogressbar ma si vede che arriva subito a 100%(dopo 2 secondi).
    Ho letto che il problema è il fatto che il codice viene eseguito dentro un actionPerformed perche è quello del pulsante "entra" e quindi la jvm non riesce a fare per cosi dire il repaint.
    Ho fatto mille prove e visto mille esempi ma non riesco a risolvere il problema.
    Ti ringrazio della risposta precedente (sempre molto utile) e spero che riuscirai a risolvere anche questo mio problema.
    P.s. La classe che visualizza la jframe non ha un main perche è chiamata da un'altra classe.
  • Re: Realizzazione di finestra

    Penso di aver risolto il problema che ti affliggeva, ho creato un Thread che gestisce il valore della barra, e non appena la barra è piena questo mostra la finestra che ti serve.
    
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import javax.swing.*;
    
    /**
     *
     * @author Luigi
     */
    public class Main extends JFrame implements ActionListener
    {
    
        private Container contenitore;
        private JButton Bottone;
        private Finestra finestra = null;
    
        private JProgressBar Barra = null;
        private GestisciValoreBarra ValoreBarra = 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("Entra");
                Bottone.addActionListener(this);
    
                contenitore.add(Bottone);
    
                Barra = new JProgressBar(0, 100);
                Barra.setPreferredSize(new Dimension(100, 15));
    
                contenitore.add(Barra);
    
                finestra = new Finestra("Finestra 2", this.getOwner()); //il codice di questa classe lo trovi nel forum, vedi le risposte precedenti
                finestra.setLocation(50, 50);//posiziona la finestra nello schermo
                finestra.setSize(200, 200);
                finestra.setVisible(false);
    
                ValoreBarra = new GestisciValoreBarra(Barra, contenitore, finestra);//finestra può essere sia un JFrame che un JDialog
    
                this.setVisible(true);
            }
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            // TODO code application logic here
            new Main();
    
        }
    
        public void actionPerformed(ActionEvent e) {
            if(e.getSource() == Bottone)
                {
                    ValoreBarra.start();
                }
        }
    
    public class GestisciValoreBarra extends Thread
            {
                private final int VALORE_INCREMENTO = 2;
                private JProgressBar Barra = null;
                private Container Contenitore = null;
                private int ValoreCorrente = 0;
                private Window Finestra = null;
    
                public GestisciValoreBarra(JProgressBar Barra, Container contenitore, Window finestra)
                    {
                        this.Barra = Barra;
                        Contenitore = contenitore;
                        Finestra = finestra;
                        Finestra.setVisible(false);
                    }
    
            @Override
                public void run()
                    {
                        while(ValoreCorrente < Barra.getMaximum())
                            {
                                ValoreCorrente += VALORE_INCREMENTO;
                                Barra.setValue(ValoreCorrente);
                                Contenitore.repaint();
                                try
                                    {
                                        Thread.sleep(100);
                                    }
                                catch (InterruptedException ex) {}
    
                            }
    
                        Finestra.setVisible(true);
                    }
            }
    
    }
    
  • Re: Realizzazione di finestra

    Una cosina veloce se la sai al volo.
    Sto usando il componente JFormattedTextfield e sono riuscito a impostarlo nel formato H.mm ma se metto di default una stringa del tipo "13.22" (che spunta cioè subito quando appare la finestra) poi col metodo get mi ritorna null e non il valore....invece se la modifico nell'esecuzione del prg allora funziona.
    In pratica a me servirebbe la seguente cosa:
    Ho una finestra con questo campo di testo formattato e mi dovrebbe gia apparire una stringa del tipo "13.22" (quando compare la finestra) e quando premo il pulsante fine dovrebbe riuscire a "prelevare" il valore.
    Lo so che mi sono spiegato male ma ho pochissimo tempo...in caso stasera te lo spiego meglio.
  • Re: Realizzazione di finestra

    Sinceramente non so perché si comporta in questo modo, visto che quando modifichi il valore dal programma lo prende, metti una variabile boolean che tiene lo stato del campo, cioè se è stato aggiornato metti la variabile a true e quindi sai che ora puoi prelevare il valore perché il valore iniziale è stato cambiato, se è false ritorni il valore che metti all'inizio.
    Oppure invece di fare un controllo con la variabile, controlli se il valore ritornato è null, se è null ritorni il valore che metti all'inizio, altrimenti quello che è presente.
    Se vuoi metti il pezzo di codice dove crei l'oggetto e lo gestisci che lo provo.
  • Re: Realizzazione di finestra

    Ho risolto...è stato un mio errore banale causato dalla fretta...non avevo settato il valore di default nel campo ma il testo di default...
Devi accedere o registrarti per scrivere nel forum
43 risposte