[英]Drawing Shapes with lines on a transparent Graphics2D to get a png image
[英]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系統和其他低級的東西,比如drawImage
或drawString
,如果你還沒有這樣做的話。
使用Java2D通常有助於將您的應用程序想象為動畫。 想象一下,在屏幕上繪制一個特定的幀(我說的是動畫幀好)。 當某些事件發生時,我們將這個框架替換為包含更改的另一個框架,就像構建卡通或動畫電影的方式一樣。 我們如何繪制動畫幀? 我們如何在幀之間切換?
Java API為其繪制的組件提供了繪制(圖形g)方法。 然后更新你真正調用repaint()的相同組件,它再次簡單地調用paint(Graphics g)並在屏幕上顯示任何更改。 這個API方法有一個嚴格的簽名,我們將遵循。 它是油漆(圖形g)。 但是Graphics2D很像一個很酷的孩子,提供更多的功能,因為圖形太舊(遺留)而且不再酷。 那么我們怎么做呢,因為paint(Graphics g)只接受Graphics而不是Graphics2D? Graphics2D是Graphics okay的子類。
協議很簡單,
代碼問題:它只是簽名。 Java和repaint()期望該方法是繪制(Graphics g),但是您已經更改了簽名,現在上面的協議(或合同)被破壞了。 我們的想法是保持合同(不改變簽名),然后進行類型轉換和覆蓋以添加擴展功能。 Java無法找到paint(Graphics g),因此repaint()也不會找到paint(Graphics g)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.