2012-03-08 165 views
9

我想繪製Java的Canvas,但無法使它工作,因爲我不知道自己在做什麼。以下是我的簡單代碼:使用Canvas使用Java繪圖

import javax.swing.JFrame; 
import java.awt.Canvas; 
import java.awt.Graphics; 
import java.awt.Color; 

public class Program 
{ 
    public static void main(String[] args) 
    { 
     JFrame frmMain = new JFrame(); 
     frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frmMain.setSize(400, 400); 

     Canvas cnvs = new Canvas(); 
     cnvs.setSize(400, 400); 

     frmMain.add(cnvs); 
     frmMain.setVisible(true); 

     Graphics g = cnvs.getGraphics(); 
     g.setColor(new Color(255, 0, 0)); 
     g.drawString("Hello", 200, 200); 
    } 
} 

窗口上不顯示任何內容。

我錯認爲Canvas是一張紙,圖形是我的鉛筆?它是如何工作的?

+0

你只是想繪製圖形? – John 2012-03-08 04:03:55

回答

31

建議:

  • 不要使用畫布,你不應該與Swing組件混合不必要AWT。
  • 改爲使用JPanel或JComponent。
  • 不要因爲Graphics對象獲得的將是短暫的一個組件上調用getGraphics()讓你的圖形對象。
  • 在JPanel的paintComponent()方法中繪製。
  • 所有這些在很多容易找到的教程中都有很好的解釋。爲什麼不在猜測這些東西之前先閱讀它們?

主要教程鏈接:

+5

謝謝!我確實在網上搜索。是的,他們很容易找到,但不容易理解。 – dpp 2012-03-08 04:51:53

+0

希望我可以放棄對每個點的讚賞,但似乎不使用Canvas for Swing首先佔有重要的地位。 – 2012-03-08 08:04:33

+0

+1好的答案,我認爲這個信息有助於提問 – John 2012-03-09 02:18:52

6

你得重寫你的畫布的paint(Graphics g)方法,有執行繪圖。見the paint() documentation.

正如它指出,默認操作是清除畫布,所以你到畫布圖形調用對象不執行你所期望的。

1

爲什麼第一種方式行不通。畫布對象被創建並且尺寸被設置並且圖形被設置。我總是覺得這很奇怪。此外,如果一個類擴展JComponent的可以覆蓋

paintComponent(){ 
    super... 
} 

,然後你不應該能夠創建和實例類的另一個類的內部,然後就打電話NewlycreateinstanceOfAnyClass.repaint();

我已經試過這種方法對於一些遊戲編程,我一直在努力,它似乎並不像我認爲的那樣工作。

道格Hauf

1

下面應該工作:

public static void main(String[] args) 
{ 
    final String title = "Test Window"; 
    final int width = 1200; 
    final int height = width/16 * 9; 

    //Creating the frame. 
    JFrame frame = new JFrame(title); 

    frame.setSize(width, height); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLocationRelativeTo(null); 
    frame.setResizable(false); 
    frame.setVisible(true); 

    //Creating the canvas. 
    Canvas canvas = new Canvas(); 

    canvas.setSize(width, height); 
    canvas.setBackground(Color.BLACK); 
    canvas.setVisible(true); 
    canvas.setFocusable(false); 


    //Putting it all together. 
    frame.add(canvas); 

    canvas.createBufferStrategy(3); 

    boolean running = true; 

    BufferStrategy bufferStrategy; 
    Graphics graphics; 

    while (running) { 
     bufferStrategy = canvas.getBufferStrategy(); 
     graphics = bufferStrategy.getDrawGraphics(); 
     graphics.clearRect(0, 0, width, height); 

     graphics.setColor(Color.GREEN); 
     graphics.drawString("This is some text placed in the top left corner.", 5, 15); 

     bufferStrategy.show(); 
     graphics.dispose(); 
    } 
}