[英]Override getPreferredSize and PaintComponent method, why?
[英]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
方法。 所以,如果你想知道為什么按鈕仍然出現,這是因為調用paintComponent
中JPanel
只影響JPanel
,而不是其他子組件添加到它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.