2012-01-13 75 views
8

thể trùng lặp:
Java GUI repaint() problem?repaint() trong Java

tôi viết mã Java, nhưng tôi có một rắc rối với vấn đề GUI. Khi tôi thêm một thành phần vào đối tượng JFrame, sau đó tôi gọi phương thức repaint() để cập nhật GUI nhưng nó không hoạt động. Nhưng khi tôi thu nhỏ hoặc thay đổi kích cỡ khung này, GUI sẽ được cập nhật.

Đây là mã của tôi:

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

thử 'frame.repaint();'? – Sheriff

Trả lời

15

Nếu bạn thêm JComponent đến đã xuất hiện container, sau đó bạn phải gọi

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

ví dụ

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

Nó hoạt động! Cảm ơn! –

+1

+1 để có cách tiếp cận tốt. Kính trọng –

+0

Bây giờ hãy chắc chắn rằng mã trong phương pháp chính chạy trên EDT và nó thậm chí còn tốt hơn – Robin

1

Bạn có thể cần phải gọi frame.repaint() cũng như để buộc các khung để thực sự vẽ lại bản thân. Tôi đã có vấn đề trước khi tôi cố gắng vẽ lại một thành phần và nó không cập nhật những gì được hiển thị cho đến khi phương thức repaint() của cha mẹ được gọi.

+0

Tôi thay đổi component.repaint() thành frame.repaint(), nhưng nó không hoạt động. –

2

Bạn đang làm mọi thứ theo thứ tự sai.

Bạn cần phải thêm tất cả JComponents vào JFrame, và chỉ sau đó gọi pack() và sau đó setVisible(true) trên JFrame

Nếu sau đó bạn thêm JComponents có thể thay đổi kích thước của giao diện, bạn sẽ cần phải gọi pack() lại , và sau đó repaint() trên JFrame sau khi làm như vậy.

4

Đơn giản chỉ cần viết:

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

Điều đó sẽ làm.

Kính trọng

+0

đúng, không có lý do nào để khai báo cho ContentPane +1 – mKorbel

+1

@mKorbel: Tôi đã trả lời muộn, nhưng câu trả lời của bạn bằng cách sử dụng ContentPane(), tôi đoán là tốt hơn nhiều. Một số người nói đó là một thực hành tốt. Nhưng thankx cho các điểm. Trân trọng –

Các vấn đề liên quan