簡體   English   中英

繪圖形狀在graphics2D中不起作用

[英]Drawing shapes does not work in graphics2D

下面的代碼是在applet中顯示一個三角形。但它對我不起作用。 如果我通過Graphics g而不是Graphics2D g那么它工作正常。但我想知道我在使用Graphics g時所犯的錯誤。 我是java新手,並從一些在線教程中學習。 所以請糾正我的程序並告訴我我在做什么錯。

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class Vehicle extends JFrame {

    final int WIDTH = 900;
          int HEIGHT = 650;


    public void init() {

        setSize(WIDTH, HEIGHT);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);

    }
    public void paint(Graphics2D g) {

 Graphics2D g2 = (Graphics2D) g;
     Dimension d = getSize();
     System.out.println(d);
            int[] yPoints={150,250,250};
            int[] xPoints={200,150,250};


        g2.setColor(Color.green);


        g2.drawPolygon(xPoints, yPoints, 3);
        g2.drawRect(100, 100, 100, 100);

        g2.setColor(Color.red);

        g2.fillPolygon(xPoints, yPoints, 3);
    }


    public static void main(String[] args) {
       Vehicle v= new Vehicle();
       v.init();

    }

}

方法paint(Graphics g)java.awt.Component定義。 這或多或少是遺留代碼。 但是,此API在很長一段時間內沒有發生變化,並且由現代Swing組件(如JFrame )繼承。

您不能簡單地更改方法簽名(在您的情況下paint(Graphics2D g) ),您必須使用API​​定義的簽名。

因此,在您的情況下, paint(Graphics2D g)不會覆蓋API方法paint(Graphics g) ,因此在更新JFrame時不會調用它。 什么都沒畫。

像這樣更改你的代碼:

----------------%<----------------------

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);

    }
    public void paint(Graphics g) { // <-- Change from Graphics2D to Graphics

 Graphics2D g2 = (Graphics2D) g;
     Dimension d = getSize();
     System.out.println(d);
            int[] yPoints={150,250,250};
            int[] xPoints={200,150,250};

---------------->%----------------------

在尋求幫助之前,請仔細查看您的計划正在做什么。 (不要責罵你,只是試圖為將來提供幫助。)

你有public void paint(Graphics2D g) ,正如Petersen所說,它不是JFrame類中的方法。 一個很好的技巧,用於檢查你的方法是否會執行教程說他們將做的是將@Override置於方法之上。 如果它出錯,則意味着該方法不在JFrame或您擁有的任何超類中。 否則,它會覆蓋該方法。

另外,另一個標志是下一行: Graphics2D g2 = (Graphics2D) g; 在這里你將Graphics2D對象作為Graphics2D對象進行投射......這應該永遠不需要發生..哈哈

如果您剛開始使用swing和Graphics2D,我建議學習一些Panels系統和其他低級的東西,比如drawImagedrawString ,如果你還沒有這樣做的話。

使用Java2D通常有助於將您的應用程序想象為動畫。 想象一下,在屏幕上繪制一個特定的幀(我說的是動畫幀好)。 當某些事件發生時,我們將這個框架替換為包含更改的另一個框架,就像構建卡通或動畫電影的方式一樣。 我們如何繪制動畫幀? 我們如何在幀之間切換?

Java API為其繪制的組件提供了繪制(圖形g)方法。 然后更新你真正調用repaint()的相同組件,它再次簡單地調用paint(Graphics g)並在屏幕上顯示任何更改。 這個API方法有一個嚴格的簽名,我們將遵循。 它是油漆(圖形g)。 但是Graphics2D很像一個很酷的孩子,提供更多的功能,因為圖形太舊(遺留)而且不再酷。 那么我們怎么做呢,因為paint(Graphics g)只接受Graphics而不是Graphics2D? Graphics2D是Graphics okay的子類。
協議很簡單,

  1. 使用每個組件的舊版paint(Graphics g)方法。
  2. 一旦我們使用了super.paint(Graphics g)(如果需要),我們可以將我們用於遺留目的的Graphic對象類型轉換為Graphics2D以獲得增強功能。(你已經完成了這一步)

代碼問題:它只是簽名。 Java和repaint()期望該方法是繪制(Graphics g),但是您已經更改了簽名,現在上面的協議(或合同)被破壞了。 我們的想法是保持合同(不改變簽名),然后進行類型轉換和覆蓋以添加擴展功能。 Java無法找到paint(Graphics g),因此repaint()也不會找到paint(Graphics g)。

暫無
暫無

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

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