2012-01-13 6 views
8

Powiel możliwe:
Java GUI repaint() problem?repaint() w Javie

napisać kod Java, ale mam problemy z problemem GUI. Kiedy dodaję komponent do obiektu JFrame, wówczas wywoływam metodę repaint() w celu aktualizacji GUI, ale to nie działa. Ale kiedy minimalizuję lub zmieniam rozmiar tej ramki, GUI jest aktualizowany.

Oto mój kod:

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

spróbuj 'frame.repaint();'? – Sheriff

Odpowiedz

15

Jeśli dodałeś już widoczne JComponent do kontenerów, to trzeba zadzwonić

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

np

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

To działało! Dzięki! –

+1

+1 za dobre podejście. Pozdrawiam –

+0

Teraz upewnij się, że kod w głównej metodzie działa na EDT i byłoby jeszcze lepiej – Robin

1

może trzeba zadzwonić frame.repaint() także zmusić ramkę faktycznie przerysować się. Wcześniej miałem problemy, zanim próbowałem odświeżyć składnik i nie aktualizowano tego, co było wyświetlane, dopóki nie została wywołana metoda odświeżania rodzica().

+0

Zmieniam component.repaint() na frame.repaint(), ale to nie działa. –

2

Robisz rzeczy w niewłaściwej kolejności.

Musisz najpierw dodać wszystkie JComponents do JFrame, a dopiero potem zadzwonić pack() a następnie setVisible(true) na JFrame

Jeśli później dodał JComponents które mogłyby zmienić rozmiar GUI będzie trzeba zadzwonić pack() ponownie , a następnie repaint() na JFrame po wykonaniu tej czynności.

4

Wystarczy napisać:

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

Że zrobi.

Pozdrawiam

+0

prawda, nie ma powodu, aby zadeklarować dla ContentPane +1 – mKorbel

+1

@mKorbel: Spóźniłem się na odpowiedź, ale twoja odpowiedź za pomocą ContentPane(), chyba jest dużo lepsza. Niektórzy mówią, że to dobra praktyka. Ale dziękuję za punkty. pozdrowienia –