2009-04-22 36 views
24

Tôi đang cố gắng tạo một trình soạn thảo vẽ bằng Java, trong đó tôi có một thanh công cụ với các đối tượng mà tôi muốn dán vào khung vẽ. Tôi đang sử dụng các thành phần Swing để tạo GUI, nhưng khi tôi tìm cách tạo khung vẽ, tôi chỉ tìm thấy canvas lớp từ AWT.Làm thế nào để làm cho vải với Swing?

Có cách nào để tạo một thứ gì đó tương tự như canvas với Swing không? (Ví dụ, JPanel?) Tôi đã đọc rằng sử dụng lớp vải từ AWT với một giao diện đồ họa được thực hiện với swing sẽ không hoạt động chính xác, đó là sự thật?

Trả lời

14

Có thể bạn sẽ muốn tạo một lớp con của JPanel và triển khai cách vẽ thành phần của riêng bạn mà bạn muốn vẽ lên bảng điều khiển.

Cách tiếp cận cơ bản có thể nằm dọc theo đường phân công MouseListener cho lớp con của JPanel, sau đó triển khai chức năng vẽ.

Ý tưởng cơ bản có thể là cái gì đó dọc theo dòng:

class MyCanvas extends JPanel implements MouseListener 
{ 
    Image img;  // Contains the image to draw on MyCanvas 

    public MyCanvas() 
    { 
     // Initialize img here. 
     this.addMouseListener(this); 
    } 

    public void paintComponent(Graphics g) 
    { 
     // Draws the image to the canvas 
     g.drawImage(img, 0, 0, null); 
    } 

    public void mouseClicked(MouseEvent e) 
    { 
     int x = e.getX(); 
     int y = e.getY(); 

     Graphics g = img.getGraphics(); 
     g.fillOval(x, y, 3, 3); 
     g.dispose(); 
    } 

    // ... other MouseListener methods ... // 
} 

Ví dụ trên là không đầy đủ (và không được kiểm tra - nó chắc chắn sẽ không biên dịch), nhưng nó mang lại một ý tưởng về cách triển khai một lớp học MyCanvas trong đó người dùng có thể nhấp vào và vẽ vòng kết nối.

Đối tượng img được sử dụng để giữ hình ảnh của canvas. Phương pháp paintComponent được sử dụng để vẽ đối tượng img vào canvas. Trong phương thức mouseClicked, đối tượng Graphics được liên kết với img được truy xuất để fillOval vào hình ảnh.

Vì một trong những yêu cầu là dán hình ảnh lên canvas, bạn nên giữ một số ảnh Image mà bạn muốn dán vào canvas. Có lẽ một cái gì đó dọc theo dòng:

Image[] myImages; // Used to store images to paint to screen. 

Sau đó, trong các thói quen để vẽ hình ảnh vào img lưu trữ trong MyCanvas:

g.drawImage(myImage[INDEX_OF_DESIRED_IMAGE], 0, 0, null); 

Bằng việc sử dụng phương pháp drawImage của đối tượng Graphics, Image s khác có thể được vẽ lên Image s.


Đối với câu hỏi trên AWT và Swing, có, bạn không muốn trộn các thành phần từ AWT và Swing, vì chúng khác nhau theo cách chúng hiển thị thành phần GUI. AWT dựa trên các thành phần nặng, có nghĩa là chúng là cửa sổ gốc để vẽ GUI, trong khi Swing dựa trên các thành phần nhẹ, có nghĩa là GUI được vẽ bởi chính Java mà không cần sử dụng các thành phần gốc.

Hướng dẫn tốt về sự khác biệt của AWT và Swing được cung cấp trong Painting in AWT and Swing bài viết từ Sun.

+0

URL đã thay đổi kể từ năm 2009. Tìm thấy vị trí thực tế của bài viết tại http://www.oracle.com/technetwork/java/painting-140037.html – Javier

43

Để tạo một 'Canvas' tùy chỉnh, bạn thường viết một lớp con của JPanel. Sau đó, bạn phải ghi đè phương thức protected paintComponent(Graphics g) của JPanel.

Trong phương pháp vẽ, bạn có thể gọi các phương thức trên đối tượng Graphics để thực sự vẽ trên JPanel.

Như mọi khi, Hướng dẫn Java có một số great reference về điều này để giúp bạn bắt đầu.

+0

Rất hữu ích! Tôi không biết rằng một JPanel có thể rất đa dạng. :-) –

12

Đơn giản chỉ cần phân lớp JComponent.

JPanel là một lớp không phù hợp. Nó thường được gợi ý vì nó có vẻ tự động được gọi là setOpaque(true). Nó thực sự là PL & F làm điều đó, và có hay không nó thực sự xảy ra là thực hiện và nhà cung cấp phụ thuộc.

Canvas là một thành phần hạng nặng. Đó là để nói rằng nó được điều khiển bởi hệ thống cửa sổ nằm bên dưới. Kết quả là nó thường sẽ được vẽ trên đầu các thành phần Swing, mà không cần phải z-order hoặc clipping (đặt nó trong một cửa sổ cuộn sẽ cho hành vi lẻ).

2

Bạn có thể muốn xem API Minueto. Nó rất đơn giản để sử dụng đồ họa api, và bạn có thể kết hợp sự kiện Java nghe với nó để cung cấp khả năng vẽ của bạn.

http://minueto.cs.mcgill.ca/

Các vấn đề liên quan