ciao a tutti,
ho bisogno di un aiuto urgente. In pratica devo disegnare 10 ellissi di dimensione e posizione casuale che si aggiornano ogni volta che premo il pulsante aggiorna o inserisco un numero nella casella di testo.
Il problema è che non so come evitare il repaint delle ellissi se semplicemente abbasso o sposto la finestra. Grazie mille a chiunque possa aiutarmi
Questo il file contenente il metodo main
E questo il file contenente pulsanti e disegnocodice:import javax.swing.JFrame; public class Ellissi2Viewer { public static void main (String[] args){ Ellissi2 frame = new Ellissi2 (); frame.setSize (800,800); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); frame.setVisible (true); } }
codice:import javax.swing.*; import java.awt.*; import java.awt.geom.*; import java.awt.event.*; import java.util.Random; public class Ellissi2 extends JFrame { //variabili istanza dei panel che creo private JPanel componentiPanel; private PannelloApplicazione disegnoPanel;//il Panel che creo dopo //variabili istanza dei componenti private JLabel etichetta; private JTextField casellaTesto; private JButton aggiornaButton; //variabili istanza private int numEllissi = 10; public Ellissi2(){ componentiPanel = new JPanel(); disegnoPanel = new PannelloApplicazione(this); etichetta = new JLabel("numero di ellissi"); casellaTesto = new JTextField("10");//una casella di testo contenente "10" aggiornaButton = new JButton("aggiorna"); casellaTesto.setPreferredSize(new Dimension (100,25)); //aggiungo i componenti a componentiPanel componentiPanel.add(etichetta); componentiPanel.add(casellaTesto); componentiPanel.add(aggiornaButton); //aggiungo i panel al frame //utilizzando come layout manager BorderLayout add(componentiPanel, BorderLayout.NORTH); add(disegnoPanel, BorderLayout.CENTER); //aggiungo i listener ai componenti aggiornaButton.addActionListener(new AggiornaButtonListener()); casellaTesto.addActionListener(new CasellaTestoListener()); } /**Una classe interna che contiene aggiornaButton e implementa l'interfaccia ActionListener */ private class AggiornaButtonListener implements ActionListener{ public void actionPerformed(ActionEvent e){ if (numEllissi != 10){ disegnoPanel.aggiornaDisegno(); } } }//fine classe AggiornaButtonListener /**Una classe interna che contiene casellaTesto e implementa l'interfaccia ActionListener */ private class CasellaTestoListener implements ActionListener{ public void actionPerformed(ActionEvent event){ String numeroEllissi = casellaTesto.getText(); try{ numEllissi = Integer.parseInt(numeroEllissi); } //se il valore inserito non è valido //imposto a 10 il numEllissi catch (Exception e){ numEllissi = 10; casellaTesto.setText("10"); } disegnoPanel.aggiornaDisegno(); } }//fine classe CasellaTestoListener /**metodo pubblico che verrà invocato dalla classe PannelloApplicazione per accedere al valore della variabile istanza numEllissi */ public int getNumEllissi(){ return this.numEllissi; } }//qui finisce la classe Ellissi2 /**Una nuova classe che estende JPanel e rappresenta il pannello interno della finestra */ class PannelloApplicazione extends JPanel{ //variabili istanza private Ellissi2 nE;//mi serve per invocare getNumEllissi() //della classe Ellissi2 /**Il costruttore della classe PannelloApplicazione */ public PannelloApplicazione(Ellissi2 ellissiFrame){ nE = ellissiFrame; } /**metodo pubblico che verrà invocato dai componenti della classe Ellissi2 */ public void aggiornaDisegno(){ repaint ();//ogni volta che viene invocato aggiornaDisegno(), //repaint richiama paintComponet di JPanel } /**metodo di JPanel sovrascritto da PannelloApplicazione */ public void paintComponent (Graphics g){ super.paintComponent (g); //per richiamare il metodo paintComponent //della superclasse JPanel Graphics2D g2 = (Graphics2D) g;//con il cast recupero il riferimento //a Graphics2D Random randomGenerator = new Random (); //disegno lo sfondo int red = randomGenerator.nextInt(256); int green = randomGenerator.nextInt(256); int blue = randomGenerator.nextInt(256); g2.setColor(new Color(red, green, blue)); Rectangle sfondo = new Rectangle (0,0,800,800); g2.fill(sfondo); //disegno le ellissi g2.setColor (Color.black); int diametro1 = 0; int diametro2 =0; int numeroEllissi = nE.getNumEllissi(); for (int i=0; i<numeroEllissi; i++){ //sceglie una posizione casuale per ogni ellisse int xPosizione = randomGenerator.nextInt(601); int yPosizione = randomGenerator.nextInt(500); //sceglie per diametro1 un valore casuale tra 50 e 200 switch (randomGenerator.nextInt(2)){ case 0: diametro1 = 50; break; case 1: diametro1 = 200; break; } //sceglie per diametro2 un valore casuale tra 50 e 200 switch (randomGenerator.nextInt(2)){ case 0: diametro2 = 50; break; case 1: diametro2 = 200; break; } g2.drawOval(xPosizione, yPosizione, diametro1, diametro2); }//fine ciclo for }//fine paintComponet }//qui finisce la classe PannelloApplicazione


Rispondi quotando