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
codice:
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);
}
}
E questo il file contenente pulsanti e disegno
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