Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [JAVA - IG] Il paint avviene solo quando ingrandisco la finestra

    Ciao a tutti,

    spero di esser stato abbastanza chiaro nel titolo (e nel codice XD).
    IG= Interfaccia Grafica O.o
    Comunque... avrei voluto riuscirci da solo ma ahimè non ce l'ho fatta quindi chiedo a qualcuno che è più esperto di me.

    Ho 2 problemi .

    Primo: Questo programma disegna cerchi al click del mouse all'interno del frame.
    A me invece il disegno compare solo se ingrandisco tutte le volte il frame con il pulsante di ingrandimento

    Secondo: Come chiudo il frame nel quale leggo il raggio una volta che ho cliccato sul pulsante OK?

    Codice:
    codice:
    package programmazioneGrafica3;
    
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.geom.Ellipse2D; // definisce la classe con la quale è possibile disegnare 1 cerchio
    
    import javax.swing.JComponent;
    
    
    public class Cerchio extends JComponent
    {
     public Cerchio(double x_init,double y_init,double alt,double lung)
     {
    	 x=x_init;
    	 y=y_init;
    	 height=alt;
    	 width=lung;
    	 cerchio=new Ellipse2D.Double(x,y, height, width); // (double x, double y, double w, double h) 
     }
     
     public void paintComponent(Graphics g) 
     {
    	 Graphics2D g2 = (Graphics2D) g;
    	 g2.setColor(Color.BLACK);
    	 g2.fill(cerchio);
    	 g2.draw(cerchio);
    	 g2.setColor(Color.WHITE);
    	 repaint();
     }
     
     public double get_X()
     {
    	 return x;
     }
    
     public double get_Y()
     {
    	 return y;
     }
     
     public double getAlt()
     {
    	 return height;
     }
     
     public double getLung()
     {
    	 return width;
     }
     private Ellipse2D.Double cerchio;
     private double x;
     private double y;
     private double height;
     private double width;
    }

    e

    codice:
    package programmazioneGrafica3;
    
    import java.awt.event.*;
    import javax.swing.*;
    
    public class FrameMain 
    {
     public static void main(String[] args)
     {
    	 // Inizio creazione frame principale
    	 final JFrame frame=new JFrame(); // creo un frame in cui vedrò il cerchio
    	 final int FRAME_WIDTH=300; // definisco le dimensioni del frame
    	 final int FRAME_HEIGHT=300; // definisco le dimensioni del frame
    	 frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); // imposto le dimensioni della finestra
    	 frame.setTitle("Titolo"); // imposto il titolo della finestra
     	 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // il parametro EXIT_ON_CLOSE appartiene all'oggetto JFrame e quindi viene invocato su di esso.
         // Fine creazione frame principale
    	 
    	 // Inizio creazione frame cattura dati
    	 final JFrame richiesta = new JFrame("Inserimento Dati"); // creo un altro frame per la cattura dei dati del raggio
         richiesta.setBounds(150, 150, 300, 150); // ne setto le dimensioni
         richiesta.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // imposto che deve chiudersi se premo X
    	 JLabel label = new JLabel("Inserisci il raggio: "); // testo che fa capire a cosa serve la finestra
         final JTextField text = new JTextField(10); // campo testo che cattura il valore
         JButton button = new JButton("Draw"); // pulsante che fa disegnare quando premuto
         JPanel panel = new JPanel(); // creo un pannello a cui aggiungerò i vari componenti
         panel.add(label); 
         panel.add(text);
         panel.add(button);
         richiesta.add(panel); // aggiungo al frame il pannello contenente i vari campi
         richiesta.setVisible(true); // mostro il frame per la richiesta
         // Fine creazione frame cattura dati
         
         
         class BottonListener implements ActionListener
         {
             public void actionPerformed(ActionEvent e) 
             {
              class MousePressListener implements MouseListener
            	{
            	 public void mouseClicked(MouseEvent event) 
            	 {
            	  double raggio=Double.parseDouble(text.getText());
            	  int x = event.getX();// coordinate mouse
            	  int y = event.getY();// coordinate mouse
            	  Cerchio cerchio=new Cerchio(x-5-(raggio/2),y-30-(raggio/2),raggio,raggio); // -5 e -30 è per i bordi della finestra
            	  frame.add(cerchio);
            	 }
    
            	  public void mouseReleased	(MouseEvent event){}
            	  public void mousePressed	(MouseEvent event){}
            	  public void mouseEntered	(MouseEvent event){}
            	  public void mouseExited	(MouseEvent event){}
            	 }
             MouseListener listener = new MousePressListener();
             frame.addMouseListener(listener);
         	 
             }
         }
    
         ActionListener buttonListener = new BottonListener(); // creo l'ascoltatore per il button
         button.addActionListener(buttonListener); // aggiungo l'ascoltatore al button 
             
     	 frame.setVisible(true);// indica se voglio o meno mostrare la finestra in cui ho disegnato il cerchio.
     }
    }
    Eventuali consigli sull'ottimizzazione del codice sono sempre ben accetti.

  2. #2
    Leggevo questo trovato veramente per caso su un altra discussione:

    L'invocazione di metodi che proiettano un componente o alterano un componente già visibile devono essere affidate ad un thread apposito, detto event dispatcher thread. Se questo non accade è possibile, oltre ad un dead lock del programma se le istruzioni coinvolte ne contengano i presupposti, che il comportamento del programma non segua la successione di istruzioni contenute nel codice.
    Ma l'esempio fornito non mi è molto chiaro.
    Ora almeno so dove sta il problema (magari qualcuno che si trova ad avere lo stesso problema, sà almeno l'argomento da leggere per capire).

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Quando lanci un applicazione con Swing devi avviare un nuovo thread.
    Generalmente si fa così:

    codice:
    public static void makeGUI() {
      Applicazione a = new Applicazione();
      a.setSize(..,..);
      a.setVisible(true);
    }
    
    public static void main(String[] args) {
      try {
        SwingUtilities.invokeAndWait(new Runnable() {
          public void run() {
            makeGUI();
           }
        });
      } catch(Exception e) {e.printStackTrace();}
    }
    Generalmente comunque si estende la classe JFrame per creare la finestra, e poi si implementano i metodi necessari, e si utilizza un JPanel per disegnare.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.