[英]Java - Add new image to Jframe using JComponent on click
我使用netbeans拖放設計器創建了一個Jframe。 在這里詢問之后,我可以在Draw
類的新線程上更改來自recList
和paint(g)
的某些項目的顏色后,進行顏色更改。
現在,我想添加另一個類似DrawCar
JComponent,它將car
圖像添加到Jframe中。 我想要這個新的JComponent,因為如果背景中的正方形更改顏色,我不想重新渲染“汽車”。
因此,我使用paint()
方法創建了DrawCar
,如下所示:
public void paint(Graphics g) {
//This to make the (0,0) at the bottom-left not top-left as default.
Graphics2D g2 = (Graphics2D)g;
AffineTransform at = g2.getTransform();
at.translate(0, getHeight());
at.scale(1, -1);
g2.setTransform(at);
//Below is to draw the car
try {
image = ImageIO.read(new File("car.png"));
} catch (IOException ex) {
Logger.getLogger(Car.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
g.drawImage(image, 245, 0, null);
}
如果我將這些代碼放在Draw
類的paint()
方法中以渲染汽車,則它可以工作,因此此代碼沒有問題!
在Container
(帶有GUI的類)類中,我有一個按鈕處理程序。 我希望在單擊該按鈕時出現汽車,所以我嘗試使用添加到事件處理程序中
private void starter_btnActionPerformed(java.awt.event.ActionEvent evt) {
Thread reDraw = new Thread(new Runnable() {
@Override
public void run() {
//draw1 below is the instance of "Draw" class
//draw1.paint2(draw1.getGraphics()); //This code works with repainting the square with new color as mentioned before
DrawCar draw2 = new DrawCar();
repaint();
revalidate();
}
});
reDraw.start();
}
但它不起作用,我不知道我在這里錯過了什么。 也許有一些方法可以將DrawCar
添加到當前的JFrame中?
感謝您的時間!
編輯:我只是做一個簡單的項目,使其清楚。 我創建了一個名為Test
的JFrame,並在其中放置了一個按鈕,單擊該按鈕將顯示圖片。 全部都是自動生成的代碼。
現在,我創建一個新類MyClass
public class MyClass extends JComponent{
private BufferedImage image;
MyClass(){
try {
image = ImageIO.read(new File("D://pic.jpg"));
} catch (IOException ex) {
Logger.getLogger(this.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(image, 50, 50, null);
}
}
在Test
,按鈕的事件處理程序如下所示:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
MyClass mc = new MyClass();
add(mc);
repaint();
revalidate();
}
我單擊它,沒有任何反應。 圖片應該顯示在單擊上。 我如何做到這一點? 謝謝
編輯2:
這是我想要實現的圖像,它是底部的綠色小車,只有當我單擊“開始!”時,它才會出現。
我發現您的代碼有很多一般性問題,包括:
至於您的特定問題,您正在創建一個DrawCar組件實例,但是您似乎從未將其添加到GUI中,因此它永遠不會顯示,因為它從來都不是JFrame或JApplet或JDialog。
重新評論:
盡管paint()和paintComponent()相同,但只有一個調用另一個...
不,他們不是。 paint(...)
方法是兩者中較“原始的”,因為它基於舊的AWT代碼庫。 它不會自動執行雙重緩沖(與paintComponent不同),它負責繪制組件,組件的邊框以及該組件所擁有的任何子組件。 出於后一個原因,您要避免覆蓋它,因為如果將其弄亂,則可能會誤塗,而不僅僅是組件。
回到我的問題,我使它像這樣
DrawCar draw2 = new DrawCar(); add(draw2); draw2.setVisible(true); revalidate(); repaint();
DrawCar draw2 = new DrawCar(); add(draw2); draw2.setVisible(true); revalidate(); repaint();
我不知道添加之前是否錯過了“前綴”,代碼是自動生成的,因此我找不到任何JFrame frame = new JFrame(); 使frame.add(draw2)像其他人一樣使用他們的代碼可能我們會發現一些邏輯問題嗎?
您遇到了主要的結構性問題,因為在主GUI中再也看不到新的DrawCar類。
因此,我猜測您的主GUI中已經包含一個DrawCar組件,而您的目標是讓它在按按鈕時繪制汽車(您永遠不會說!)。 如果是這樣,那么為什么不讓DrawCar保留一個JPanel並簡單地將其Icon設置為您的圖像。 我本人是在程序啟動時讀入圖像的,如果當時是我的目標,那時候也要翻轉圖像。
同樣,如果您仍然遇到問題,則將問題隔離到最小的可編譯可運行代碼,您的mcve並讓我們對其進行測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.