2012-01-13 8 views
8

Eventuali duplicati:
Java GUI repaint() problem?repaint() in Java

ho scrivere un codice Java, ma ho un problema con il problema GUI. Quando aggiungo un componente nell'oggetto JFrame, allora chiamo il metodo repaint() per aggiornare la GUI, ma non funziona. Ma quando minimizzo o ridimensiono questo frame, la GUI viene aggiornata.

Ecco il mio codice:

public static void main(String[] args) 
{ 
    JFrame frame = new JFrame(); 

    frame.setSize(460, 500); 
    frame.setTitle("Circles generator"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    frame.setVisible(true); 

    String input = JOptionPane.showInputDialog("Enter n:"); 
    int n = Integer.parseInt(input); 

    CircleComponent component = new CircleComponent(n); 
    frame.add(component); 
    component.repaint(); 
} 
+3

try 'frame.repaint();'? – Sheriff

risposta

15

Se si è aggiunto JComponent al già visibile Contenitore, allora dovete chiamare

frame.getContentPane().validate(); 
frame.getContentPane().repaint(); 

ad esempio

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 

public class Main { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setSize(460, 500); 
     frame.setTitle("Circles generator"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       frame.setVisible(true); 
      } 
     }); 

     String input = JOptionPane.showInputDialog("Enter n:"); 
     CustomComponents0 component = new CustomComponents0(); 
     frame.add(component); 
     frame.getContentPane().validate(); 
     frame.getContentPane().repaint(); 
    } 

    static class CustomComponents0 extends JLabel { 

     private static final long serialVersionUID = 1L; 

     @Override 
     public Dimension getMinimumSize() { 
      return new Dimension(200, 100); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(300, 200); 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      int margin = 10; 
      Dimension dim = getSize(); 
      super.paintComponent(g); 
      g.setColor(Color.red); 
      g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2); 
     } 
    } 
} 
+0

Ha funzionato! Grazie! –

+1

+1 per un buon approccio. Cordiali saluti –

+0

Ora assicurati che il codice nel metodo principale funzioni su EDT e sarebbe anche meglio – Robin

1

Potrebbe essere necessario chiamare frame.repaint() anche per forzare il telaio per ridisegnare in realtà in sé. Ho avuto problemi prima di dove ho provato a ridisegnare un componente e non stava aggiornando ciò che è stato visualizzato fino a quando non è stato chiamato il metodo repaint() del genitore.

+0

Sostituisco component.repaint() con frame.repaint(), ma non funziona. –

2

stai facendo le cose in ordine errato.

È necessario aggiungere prima tutti JComponents al JFrame, e solo allora chiamare pack() e poi setVisible(true) sul JFrame

Se successivamente JComponents che potrebbero cambiare la dimensione della GUI aggiunto dovrai chiamare pack() di nuovo e quindi repaint() sulla JFrame dopo averlo fatto.

4

è sufficiente scrivere:

frame.validate(); 
frame.repaint(); 

che farà.

Saluti

+0

destra, non c'è motivo di dichiarare per ContentPane +1 – mKorbel

+1

@mKorbel: ero in ritardo per la risposta, ma la tua risposta usando ContentPane(), credo sia molto meglio. Alcuni dicono che è una buona pratica. Ma grazie per i punti. Saluti –

Problemi correlati