2012-01-13 3 views
8

Можно создать дубликат:
Java GUI repaint() problem?перекрасить() в Java

Я пишу код Java, но у меня есть проблемы с проблемой GUI. Когда я добавляю компонент в объект JFrame, я вызываю метод repaint() для обновления GUI, но он не работает. Но когда я минимизирую или изменяю размер этого фрейма, графический интерфейс обновляется.

Вот мой код:

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

ответ

15

Если вы добавили JComponent к уже ощутимы Container, то есть позвонить

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

, например

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

Это сработало! Благодаря! –

+1

+1 для хорошего подхода. С уважением –

+0

Теперь убедитесь, что код в основном методе работает на EDT, и было бы даже лучше – Robin

1

Вам может понадобиться позвонить frame.repaint(), а заставить кадр на самом деле перерисовать себя. У меня были проблемы до того, где я попытался перекрасить компонент, и он не обновлял отображаемое до тех пор, пока не вызывается метод repaint() родителя.

+0

Я меняю компонент.repaint() на frame.repaint(), но он не работает. –

2

Вы делаете вещи в неправильном порядке.

Вам нужно сначала добавить все JComponents в JFrame, и только затем вызвать pack(), а затем setVisible(true) на JFrame

Если позже добавил JComponents, которые могут изменить размер кода графического интерфейса вам нужно будет позвонить pack() снова , а затем repaint() на JFrame после этого.

4

Просто написать:

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

Это будет делать.

С уважением

+0

Право, нет причин объявлять для ContentPane +1 – mKorbel

+1

@mKorbel: Я опоздал на ответ, но ваш ответ с использованием ContentPane(), я думаю, намного лучше. Некоторые говорят, что это хорошая практика. Но спасибо за очки. С уважением –

Смежные вопросы