2014-10-06 48 views
1

上繪製所以,我有一個名爲MainClass類延伸畫布。我試圖讓我們在Canvas上繪製一個填充的矩形而不覆蓋paint方法。有沒有辦法做到這一點,或者我必須重寫繪畫方法,並把我想畫的所有?JAVA - 幫助延伸帆布

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 

import javax.swing.JFrame; 


public class MainClass extends Canvas { 
    MainClass() 
    { 
     JFrame MainWindow = new JFrame("Main Window"); 
     MainWindow.setVisible(true); 
     MainWindow.setSize(500, 500); 
     MainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     MainWindow.add(this); 
    } 

    public void paint(Graphics g) 
    { 
     super.paint(g); 
    } 

    public static void main(String[] args) 
    { 
     MainClass temp = new MainClass(); 

     Graphics g = (Graphics2D)temp.getGraphics(); 
     g.setColor(Color.red); 
     g.fillRect(0, 0, 400, 400); 
     temp.repaint(); 
    } 
} 

想法是,我有這個類,我可以得到畫布的圖形對象,並直接繪製並重畫。或者,也許我正在考慮將形狀和物體傳遞給一種方法,以便在某個位置爲我繪畫。

+2

*「有沒有辦法做到這一點,或者我必須重寫繪畫方法,並把所有我想畫在那裏?」*簡短的答案是否 – MadProgrammer 2014-10-06 23:02:04

+0

更長的答案是,你需要使用[ 'BufferStrategy'(http://docs.oracle.com/javase/tutorial/extra/fullscreen/bufferstrategy.html),但這然後要求你把繪畫過程,這只是增加了複雜程度的控制... – MadProgrammer 2014-10-06 23:40:54

回答

4
  1. 不要使用畫布。
  2. 取而代之的是擴展JPanel
  3. 並覆蓋JPanel的paintComponent方法,而不是paint方法(爲什麼不重寫這些方法?你有什麼反對在它們內部繪製?)。
  4. 在谷歌的Java Swing繪畫教程,並通過他們去。 Here's the link
  5. 通過一個組件上調用getGraphics(),你將獲得可能在那個時候的工作權利短暫的顯卡方面,但會失敗,如果任何重繪發生的工作(而這些都不是你的控制之下),導致無論是程序圖形失敗或NullPointerException。你應該避免這樣做,除非你急需並知道你在做什麼。要「知道你在做什麼」,請閱讀Haase和Guy的書Filthy Rich Clients
  6. 注意,你總是可以直接借鑑使用從圖像導出的圖形對象一個BufferedImage,但你還是應該應用BufferedImage在paintComponent(...)方法重寫。
+0

我正在做作業,代碼的骨架擴展了Canvas。我希望在paint方法之外的原因是因爲我想讓我們說一個特定的方法被調用時繪製一個圓,或者當調用另一個方法時繪製一個矩形。我不想有一些瘋狂的標記和重繪,並有油漆方法選擇從國旗畫什麼。 – user3689034 2014-10-06 23:15:31

+0

@ user3689034:Swing圖形是被動的,所以你最好的選擇是繪製繪製方法或BufferedImage(它仍然以繪畫方法繪製)。請注意,您可以在'ArrayList '中添加或移除圖形,然後在繪畫方法中遍歷列表。這裏有很多選擇。 – 2014-10-06 23:18:10