簡體   English   中英

如何使用Swing制作畫布?

[英]How to make canvas with Swing?

我正在嘗試使用Java制作一個繪圖編輯器,其中我有一個工具欄,其中包含我想要在畫布中粘貼的對象。 我正在使用Swing組件來制作GUI,但是當我尋找制作畫布的方法時,我只從AWT中找到了類畫布。

有沒有辦法用Swing制作類似於畫布的東西? (例如,JPanel?)我已經讀過,使用AWT的類畫布和使用swing制作的GUI將無法正常工作,這是真的嗎?

為了在swing中制作自定義的'Canvas',你通常會編寫一個JPanel的子類。 然后,你必須覆蓋protected paintComponent(Graphics g)的方法JPanel

在paint方法中,您可以調用Graphics對象上的方法來實際繪制JPanel

與往常一樣,Java教程有一個很好的參考 ,以幫助您入門。

您可能想要創建JPanel的子類並實現自己繪制要在面板上繪制的組件的方式。

基本方法可能是將MouseListener分配給JPanel的子類,然后實現繪制功能。

基本思想可能是:

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 ... //
}

上面的例子是不完整的(並且沒有經過測試 - 它絕對不會編譯),但它提供了一個關於如何實現MyCanvas類的想法,用戶可以在其中點擊並繪制圓圈。

img對象用於保存畫布的圖像。 paintComponent方法用於將img對象繪制到畫布。 mouseClicked方法中,檢索與img關聯的Graphics對象,以便將fillOval到圖像上。

由於要求是將圖像粘貼到畫布上,因此最好將一些要粘貼的Image粘貼到畫布中。 也許是這樣的:

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

然后,在例程中將圖像繪制到存儲在MyCanvas img

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

通過使用Graphics對象的drawImage方法,可以將其他Image繪制到Image


關於AWT和Swing的問題,是的,你確實不想混合AWT和Swing中的組件,因為它們在呈現GUI組件方面有所不同。 AWT基於重量級組件,這意味着它們是用於繪制GUI的本機窗口,而Swing基於輕量級組件,這意味着GUI本身是由Java自己繪制的,而不使用本機組件。

關於AWT和Swing差異的一個很好的指南在Sun的AWT和Swing文章中提供。

簡單地將JComponent子類化。

JPanel是一個不合適的類。 它經常被建議,因為它似乎自動調用setOpaque(true) 它實際上是PL&F做到這一點,它是否實際發生是依賴於實現和供應商。

Canvas是一個重量級的組件。 也就是說它由底層窗口系統控制。 結果是它通常會被繪制在Swing組件的頂部,而不考慮z順序或剪輯(將它放在滾動窗格中會產生奇怪的行為)。

您可能想要查看Minueto API。 使用圖形api非常簡單,您可以將Java事件監聽與它結合起來,以提供您的繪圖功能。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM