簡體   English   中英

JPanel繪圖 - 為什么我必須覆蓋paintComponent方法?

[英]JPanel drawing - why do I have to override paintComponent method?

我正在學習Java,我已經開始玩繪畫的可能性了。

基本上我有兩個問題:

  1. 為什么我必須覆蓋paintCompoment方法才能在JPanel上繪制一些東西?
  2. 考慮到我調用f.add(new MyPanel());時的第一個例子f.add(new MyPanel()); 它創建一個新的MyPanel對象並繪制文本。 為什么要繪制文字? 方法paintComponent(g)未被調用。

對我來說,看起來我有兩個選擇:

第一個(來自http://docs.oracle.com/javase/tutorial/uiswing/painting/step2.html ):

package painting;

import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

public class SwingPaintDemo2 {

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

    private static void createAndShowGUI() {
        System.out.println("Created GUI on EDT? "+
        SwingUtilities.isEventDispatchThread());
        JFrame f = new JFrame("Swing Paint Demo");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new MyPanel());
        f.pack();
        f.setVisible(true);
    }
}

class MyPanel extends JPanel {

    public MyPanel() {
        setBorder(BorderFactory.createLineBorder(Color.black));
    }

    public Dimension getPreferredSize() {
        return new Dimension(250,200);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);       

        // Draw Text
        g.drawString("This is my custom Panel!",10,20);
    }  
}

第二個:也適用

Graphics g = panel.getGraphics();
g.setColor(new Color(255, 0, 0));
g.drawString("Hello", 200, 200);
g.draw3DRect(10, 20, 50, 15, true);
panel.paintComponents(g);

你不應該自己調用paintComponent()

paintComponent()被自動調用(由UI線程)。

如果將paintComponent()方法留空,則會調用它,但不會繪制任何內容,因為它是空的。

暫無
暫無

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

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