簡體   English   中英

為什么不能使用“圖形”在我的JPanel上繪畫?

[英]Why can't I paint onto my JPanel using Graphics?

當我嘗試繪制擴展版的JPanel時,我一直遇到這個問題。 每次,我最終都找到一種使其工作的方法。 但是我想確切地知道為什么以這種方式向JPanel繪畫不起作用?

public class MyPanel extends JPanel {

public MyPanel(){
    init();
}

public void init(){
    JFrame frame = new JFrame("");
    frame.add(this);
    this.setPreferredSize(new Dimension(100,100));
    this.setBackground(Color.RED);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);

    Graphics g = this.getGraphics();
    g.setColor(Color.BLUE);
    g.fillRect(0, 0, 50, 50);
}

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

}

當我運行此代碼時,我看到了setBackground(Color.RED)所期望的紅色背景,但是看不到使用Graphics對象繪制的藍色矩形。 即使我在init()的最后一行調用repaint(),它也不會顯示。

該代碼有什么問題,所以將來可以避免嗎?

為什么不能使用“圖形”在我的JPanel上繪畫?

因為這不是正確的方法。 您應該重寫paintComponent方法:

public class MyPanel extends JPanel {

    public MyPanel(){
        init();
    }

    public void init(){
        JFrame frame = new JFrame("");
        frame.add(this);
        this.setPreferredSize(new Dimension(100,100));
        this.setBackground(Color.RED);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);

    }

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

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLUE);
        g.fillRect(0, 0, 50, 50);
    }
}

如果不這樣做,您的圖形將僅顯示一會兒,然后消失。 這樣,無論何時調用repaint方法(或應用程序自身重新繪制),該方法都會被調用,並且矩形將被填充。

Swing中的自定義繪制通常是通過重寫從JComponent擴展的類的paintComponent方法來完成的

有關詳細信息,請參見在自定義繪畫中執行

基本上,問題是,Swing中的繪畫是破壞性的過程。 每次發生油漆循環時,都應清潔並重新生成輸出。 getGraphics不可靠。 它可以返回null,並且您使用它paint任何內容都將在下一個繪制周期中被過度繪制

暫無
暫無

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

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