2016-04-25 69 views
0

我有以下程序。它應該在綠色地面上打印紅色文字。當程序打開時,我只看到綠色的背景,但沒有看到它的紅色文字。一旦窗口大小調整並重新計算,就會顯示紅色文本。Java swing.JFrame只在窗口大小調整上繪製內容

如果我在窗口中使用JPanel並在其中添加組件,它將正常工作。如果顏色設置在paintComponent中,那麼一切正常。

那麼問題在哪裏,如果我直接在JFrame上繪圖。我是否錯過了第一個「更新」或什麼?它看起來像窗口第一次繪製時有一些信息缺失(附加文本),程序只有在重新計算和重繪窗口時纔會知道該信息。

import java.awt.Color; 
import java.awt.Graphics; 
import javax.swing.JFrame; 

public class PaintAWT extends JFrame { 

    PaintAWT() { 
     this.setSize(600, 400); 
     this.setLocationRelativeTo(null); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setVisible(true); 
    } 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 

     // Set background color: 
     // If you don't paint the background, one can see the red text. 
     // If I use setBackground I only see a green window, until it is 
     // resized, then the red text appears on green ground 
     this.getContentPane().setBackground(new Color(0,255,0)); 

     // Set color of text 
     g.setColor(new Color(255,0,0)); 

     // Paint string 
     g.drawString("Test", 50, 50); 
    } 

    public static void main(String[] args) { 
     new PaintAWT(); 
    } 

} 
+1

對於初學者,您應該重寫'paintComponent',而不是'paint'。我個人建議擴展一個'JPanel'而不是'JFrame'。您還需要一種方法來控制對「repaint」的調用,因爲通過Swing的邏輯,容器通常只會在需要時重新繪製(即調整窗口大小時)。 – Gorbles

回答

4

您不應該在繪畫方法中設置組件的屬性。繪畫方法僅適用於繪畫。不要使用setBackground()。

您應該在創建框架時設置內容窗格的背景。

每當你做自定義繪畫時,你也應該重寫getPreferredSize()方法來返回組件的大小。

你也不應該擴展JFrame。當您向班級添加功能時,您只能擴展一個班級。

首先閱讀Swing教程中有關Custom Painting的部分,詳細信息和工作示例。這些示例將向您展示如何更好地構建代碼以遵循Swing約定。

2

您應該將setBackground移動到構造函數中。在塗料方法中設置背景是一個不好的方法。

import java.awt.Color; 
import java.awt.Graphics; 

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class PaintAWT extends JFrame { 

    PaintAWT() { 
     this.setSize(600, 400); 
     this.setLocationRelativeTo(null); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     // Set background color: 
     // If you don't paint the background, one can see the red text. 
     // If I use setBackground I only see a green window, until it is 
     // resized, then the red text appears on green ground 
     this.getContentPane().setBackground(new Color(0,255,0)); 
     this.setVisible(true); 
    } 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 


     // Set color of text 
     g.setColor(new Color(255,0,0)); 

     // Paint string 
     g.drawString("Test", 50, 50); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new PaintAWT(); 
      } 
     }); 
    } 

} 
+1

你不應該擴展JFrame來做自定義繪畫。你不應該重寫paint()。 – camickr

+0

然後如何改變背景顏色?如果我把它放在構造函數中而不是paint方法中,它是固定的,不是嗎? – Fuzzzzel

相關問題