簡體   English   中英

Java-單擊時使用JComponent將新圖像添加到Jframe

[英]Java - Add new image to Jframe using JComponent on click

我使用netbeans拖放設計器創建了一個Jframe。 這里詢問之后,我可以在Draw類的新線程上更改來自recListpaint(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:

在此處輸入圖片說明

這是我想要實現的圖像,它是底部的綠色小車,只有當我單擊“開始!”時,它才會出現。

我發現您的代碼有很多一般性問題,包括:

  1. 永遠不要覆蓋paint方法,而要覆蓋JPanel或JComponent的paintComponent方法。
  2. 幾乎總是調用super的方法。
  3. 切勿從繪畫方法中讀取文件。
  4. 您的代碼公然違反了Swing線程規則-大多數所有Swing調用都應在Swing事件線程上進行,而不是在執行過程中對其進行處理。
  5. 最好創建並發布您的“ 最小,完整和可驗證”示例sscce,因為這樣我們可以運行您實際運行的代碼。

至於您的特定問題,您正在創建一個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.

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