2012-03-08 40 views
9

Tôi muốn vẽ trong Canvas của Java nhưng không thể làm cho nó hoạt động được vì tôi không biết mình đang làm gì. Đây là mã đơn giản của tôi:Vẽ bằng Java bằng cách sử dụng Canvas

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); 
    } 
} 

Không có gì xuất hiện trên cửa sổ.

Tôi có sai khi nghĩ rằng Canvas là giấy và Đồ họa là Bút chì của tôi không? nó vận hành như vậy sao?

+0

là bạn chỉ cần cố gắng để vẽ đồ họa? – John

Trả lời

31

Gợi ý:

  • Không sử dụng Canvas như bạn không nên trộn với các thành phần AWT Swing cách không cần thiết.
  • Thay vì sử dụng JPanel hoặc JComponent.
  • Không lấy đối tượng Đồ họa của bạn bằng cách gọi getGraphics() trên một thành phần như đối tượng Đồ họa thu được sẽ tạm thời.
  • Vẽ theo phương thức paintComponent() của JPanel.
  • Tất cả điều này cũng được giải thích trong một số hướng dẫn dễ dàng tìm thấy. Tại sao không đọc chúng trước khi cố gắng đoán ra thứ này?

liên kết chính hướng dẫn:

+5

Xin cảm ơn! Tôi đã tìm kiếm trên web. Có, chúng có thể được tìm thấy dễ dàng, nhưng không thể được hiểu dễ dàng. – dpp

+0

Ước gì tôi có thể cho upvote cho mỗi điểm, nhưng có vẻ như không sử dụng Canvas for Swing ở vị trí đầu tiên giữ một trọng lượng lớn. –

+0

+1 Câu trả lời hay, tôi nghĩ thông tin này hữu ích cho người hỏi – John

6

Bạn phải ghi đè phương thức paint(Graphics g) của Canvas và thực hiện bản vẽ ở đó. Xem the paint() documentation.

Vì trạng thái mặc định, thao tác mặc định là xóa canvas, vì vậy lệnh gọi đối tượng đồ họa của canvas không hoạt động như bạn mong đợi.

1

Tại sao cách đầu tiên không làm việc. Đối tượng Canvas được tạo và kích thước được đặt và các grahpics được đặt. Tôi luôn thấy điều này lạ. Ngoài ra nếu một lớp học kéo dài JComponent bạn có thể ghi đè lên

paintComponent(){ 
    super... 
} 

và sau đó bạn không nên có thể tạo và thể hiện của lớp bên trong của lớp khác và sau đó chỉ cần gọi NewlycreateinstanceOfAnyClass.repaint();

Tôi đã thử phương pháp này đối với một số chương trình trò chơi tôi đã làm việc và nó dường như không hoạt động theo cách tôi nghĩ rằng nó nên được.

Doug HAUF

1

Sau đây nên làm việc:

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(); 
    } 
} 
Các vấn đề liên quan