簡體   English   中英

當我用空的paintComponent(g)方法覆蓋時,為什么重新繪制組件?

[英]why components redrawn when i override with empty paintComponent(g) method?

據我所知(我是java noob),當我調整窗口大小或更改其內容時,應自動調用paintComponent()方法。 它重繪了所有內容,所以當我用一個空方法覆蓋它時,什么都不應該重繪...但它確實如此。 為什么? 可能我錯過了一些東西。 究竟什么是paintComponent()重新繪制,一切? 還是一些背景或smth?

import java.awt.*;
import javax.swing.*;

public class TextFrame extends JFrame {
       public TextFrame(String text, String fontName) {
       super("Show Font");
       setSize(725, 150);
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       TextFramePanel sf = new TextFramePanel(text, fontName);
       JButton ok = new JButton("i hate disappearing");
       sf.add(ok);

       add(sf);
       setVisible(true);
}

public static void main(String[] arguments) {
    if (arguments.length < 1) {
        System.out.println("Usage: java TextFrame message font");
        System.exit(-1);
    }
    TextFrame frame = new TextFrame(arguments[0], arguments[1]);
}

}

class TextFramePanel extends JPanel {
   String text;
   String fontName;

   public TextFramePanel(String text, String fontName) {
    super();
    this.text = text;
    this.fontName = fontName;
   }

public void paintComponent(Graphics comp) {
    //super.paintComponent(comp);
    /*Graphics2D comp2D = (Graphics2D)comp;
    comp2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
        RenderingHints.VALUE_ANTIALIAS_ON); 
    Font font = new Font(fontName, Font.BOLD, 18);
    FontMetrics metrics = getFontMetrics(font);
    comp2D.setFont(font);
    int x = (getSize().width - metrics.stringWidth(text)) / 2;
    int y = getSize().height / 2;
    comp2D.drawString(text, x, y);
    System.out.println("vlad");*/
}
}

我建議你閱讀自定義繪畫的官方文檔: http//docs.oracle.com/javase/tutorial/uiswing/painting/index.html ,更重要的是在A部分仔細查看繪制機制

以下是與您的問題直接相關的部分:

[...] paintComponent方法是放置所有繪畫代碼的地方。 確實,當需要繪制時會調用此方法,但繪制實際上從類層次開始更高,使用paint方法(由java.awt.Component定義。)此方法將由繪制子系統執行。你需要渲染組件。 它的簽名是:

public void paint(Graphics g)

[...] API不會阻止您的代碼覆蓋paintBorder和paintChildren,但一般來說,沒有理由這樣做。 出於所有實際目的,paintComponent將是您需要覆蓋的唯一方法。


所以,當你宣布:

public void paintComponent(Graphics comp) {}

你實際上什么 做。 這是因為從文檔中說明,繪畫不是以paintComponent()開頭,而是以paint()開頭,而paint()則更早。


現在,如果你這樣聲明:

public void paint(Graphics g){}

無論你在paintComponent()什么代碼,在調整大小等之后都不會重繪任何內容,因為繪制層次結構的開頭剛被定義為空例程。

“...所以當我用一個空方法覆蓋它時,什么都不應該重繪......但它是。為什么?”

所以看起來你正在從命令行運行這個程序。 如果您正在運行該程序,並且它仍然在paintComponent方法中繪制內容(即使在您注釋掉其內容之后),很可能您再次編譯運行該程序。 所以該程序仍然從同一個.class文件運行。

當我按原樣運行程序時,我只看到一個按鈕,沒有任何畫字。

C:\\stack>java TextFrame Hello World


“paintComponent()究竟是什么重新繪制的,一切都是什么?還是某些背景或者什么?”

paintComponent只是繪制組件本身,這只是你的情況下的JPanel 它不會繪制添加到其中的任何其他組件。 該繪畫由其 paintComponent方法委派。 每個JComponent都有自己的paintComponent方法。 所以,如果你想知道為什么按鈕仍然出現,這是因為調用paintComponentJPanel只影響JPanel ,而不是其他子組件添加到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM