[英]How to make canvas with Swing?
我正在嘗試使用Java制作一個繪圖編輯器,其中我有一個工具欄,其中包含我想要在畫布中粘貼的對象。 我正在使用Swing組件來制作GUI,但是當我尋找制作畫布的方法時,我只從AWT中找到了類畫布。
有沒有辦法用Swing制作類似於畫布的東西? (例如,JPanel?)我已經讀過,使用AWT的類畫布和使用swing制作的GUI將無法正常工作,這是真的嗎?
您可能想要創建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事件監聽與它結合起來,以提供您的繪圖功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.