2017-05-28 79 views
2

我一直試圖弄清楚這一點,但我似乎無法弄清楚。如何在JPanel上顯示多個圖像?

我想顯示在相同的JPanel,但由於某種原因,在屏幕上多個圖像,只顯示來自塗料成分

我試圖做一個水果忍者風格的遊戲,最後的圖像並希望在動畫發生之前從框架中取得成果。

有誰有如何做到這一點?任何幫助,將不勝感激的想法...

import javax.swing.*;//imports JPanel class 
import java.awt.*;//imports the Graphics class 

public class FruitNinja extends JPanel { 

    private Image dojo; 
    private Image apple; 
    private Image orange; 
    private Image pineapple; 
    private Image strawberry; 
    private Image banana; 

    private Timer timer; 
    private int x, y; 

    public FruitNinja() { // a constructor to set up graphics windo 
     super(); 
     setBackground(Color.WHITE); 
     loadImage(); 
     x = 25; 
     y = 25; 


    } 



    private void loadImage() { 
     ImageIcon ii = new ImageIcon("Dojo.jpg"); 
     dojo = ii.getImage(); 

     ImageIcon oo = new ImageIcon("Orange.ico"); 
     orange = oo.getImage(); 

     ImageIcon ss = new ImageIcon("Strawberry.png"); 
     strawberry = ss.getImage(); 

     ImageIcon bb = new ImageIcon("Banana.png"); 
     banana = bb.getImage(); 

     ImageIcon pp = new ImageIcon("Pineapple.png"); 
     pineapple = pp.getImage(); 

     ImageIcon aa = new ImageIcon("Apple.png"); 
     apple = aa.getImage(); 


    } 

    public void paintComponent(Graphics g){ // draw graphics in the panel 

     super.paintComponent(g);// to make panel display correctly 
     g.drawImage(dojo, 0,0, this); 
     //draws out dojo 


     super.paintComponent(g);// to make panel display correctly 
     g.drawImage(apple, 0,0, this); 

     super.paintComponent(g);// to make panel display correctly 
     g.drawImage(orange, 0,0, this); 

     super.paintComponent(g);// to make panel display correctly 
     g.drawImage(pineapple, 0,0, this); 

     super.paintComponent(g);// to make panel display correctly 
     g.drawImage(banana, 0,0, this); 

     super.paintComponent(g);// to make panel display correctly 
     g.drawImage(strawberry, 0,0, this); 

     //draws out the fruits somewhere 
    } 

    /* 
    @Override 
    public void actionPerformed(ActionEvent e) { 

     x += 5; 
     y += 5; 

     if (y > getHeight()) { 
     y = 25; 
     x = 25; 
     } 
     repaint(); 
    } 
*/ 

    public static void main(String[] args) { 

     FruitNinja panel = new FruitNinja(); // window for drawing 
     JFrame f = new JFrame(); // the program itself 
     f.setTitle("Fruit Ninja"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//when the X button is clicked, the program quits 
     f.setSize(1280,800);//size of the frame 
     Container pane = f.getContentPane();//pane refers to the interior of the JFrame 

     FruitNinja p1 = new FruitNinja(); 

     pane.add(p1);//add the FacePanel object to the interior of the frame 
     f.setVisible(true); 

    } 
} 

也無關,這個當前問題,因爲我想做一個像FruitNinja遊戲,我該如何做到這一點,因此代碼註冊了我的鼠標在那裏(所以當我的鼠標懸停在水果上時,它會切割水果)?它是mouseListenter嗎?

+0

最簡單的解決方案是使用一個合適的佈局管理器和'JLabel's – MadProgrammer

+0

我建議具有[在AWT和Swing繪畫](http://www.oracle.com/technetwork/java/看看painting-140037.html)來理解你爲什麼遇到你遇到的問題 – MadProgrammer

+0

完成這件事。 – Martin

回答

3

我建議在看看Painting in AWT and Swing理解爲什麼你有你有

一說paintComponent做它準備Graphics上下文部件的塗裝作業的問題,它通常做這與上述成分的背景顏色填充的

所以根據你的代碼,那就表明你只需要調用paintComponent一次,在方法的開始

public void paintComponent(Graphics g){ // draw graphics in the panel 

    super.paintComponent(g);// to make panel display correctly 
    g.drawImage(dojo, 0,0, this); 
    //draws out dojo 
    g.drawImage(apple, 0,0, this); 
    g.drawImage(orange, 0,0, this); 
    g.drawImage(pineapple, 0,0, this); 
    g.drawImage(banana, 0,0, this); 
    g.drawImage(strawberry, 0,0, this); 
    //draws out the fruits somewhere 
} 

所以,現在所有的圖片應塗上的相互

也無關,這個當前問題上面,因爲我想做一個水果忍者遊戲,我怎麼讓它所以代碼寄存器我的鼠標在那裏(所以當我的鼠標懸停在水果上時,它會切割水果)?它是mouseListenter嗎?

你可能尋找一個MouseMotionListener,看看How to Write a Mouse Listener更多細節

+0

好的,謝謝你的幫助!我非常感謝您提供的信息以及額外的信息,以幫助像我這樣的新程序員。再次感謝您的快速回復。 – Martin

1

您已經擴展JPanel並在JPanel你在同xy,這是0已制定。並且在重載的paintComponent()方法中,您正在調用super類方法的次數。正因爲如此,你只能看到最後繪製的圖像。

更改此:

super.paintComponent(g); 
    g.drawImage(apple, 0,0, this); 

    super.paintComponent(g); 
    g.drawImage(orange, 0,0, this); 

    super.paintComponent(g); 
    g.drawImage(pineapple, 0,0, this); 

    super.paintComponent(g); 
    g.drawImage(banana, 0,0, this); 

    super.paintComponent(g); 
    g.drawImage(strawberry, 0,0, this); 

要:

super.paintComponent(g); 

    g.drawImage(apple, 0,0, this); 
    g.drawImage(orange, 0,0, this); 
    g.drawImage(pineapple, 0,0, this); 
    g.drawImage(banana, 0,0, this); 
    g.drawImage(strawberry, 0,0, this); 

不過你看不到其他圖像,因爲所有的圖像都在彼此的頂部。爲了避免這種情況,你可以做這樣的事情:

super.paintComponent(g); 

    g.drawImage(dojo, x,0, this); 
    g.drawImage(apple, x,100, this); 
    g.drawImage(orange, 300,100, this); 
    g.drawImage(pineapple, x,300, this); 
    g.drawImage(banana, 300,0, this); 
    g.drawImage(strawberry, 300,300, this); 

您可以更改xy cordinate只要你想。但這仍然是令人困惑和惱人的,也是很耗時的。那麼,有一個更好的方法來做到這一點。那是Layout Manager

想一想在您的程序中使用Layout Manager的方法。這些鏈接可能會對您有所幫助:

在你的問題的最後一部分,你提到的有關

如何讓我這麼碼寄存器,我的鼠標是有

你需要得到指針的當前位置(xy)。

是不是mouseListenter?

不,它不是,除非你沒有很多事件。 mouseListenter用於組件上的鼠標事件(按下,釋放,單擊,輸入和退出)。

根據上述說明,您需要的是MouseMotionListener。它用於組件上的鼠標移動事件。

UPDATE(按評論):

我真的不知道如何使用的MouseMotionListener?我已經能夠 動畫的水果/圖像,所以它現在圍繞我的框架飛行。 我如何使用MouseMotionListener將該水果移出框架 我將鼠標懸停在框架上?

這是出了問題的範圍,但作爲一個幫助,

嘛,這個你必須將所有圖像添加到JLabelš否則,你可以添加監聽到面板上。由於有多個圖像,您必須創建標籤。要做到這一點,我已經創造了新的方法,代碼應該是這樣的:

public void moveImage(ImageIcon icon){ 
    JLabel dojoLabel = new JLabel(); 
    dojoLabel.setIcon(icon); 
    this.add(dojoLabel); 

    dojoLabel.addMouseMotionListener(new MouseMotionAdapter() { 
     public void mouseMoved(MouseEvent evt){ 
      dojoLabel.setLocation(0,0); 
      repaint(); 
     } 
    }); 
} 
loadImage()調用內部

現在這種方法解析ImageIcon。不能將Image類型添加到JLabel。這就是爲什麼你需要添加ImageIcon

private void loadImage() { 
     ImageIcon ii = new ImageIcon("Dojo.jpg"); 
     dojo = ii.getImage(); 
     //..... 
     //move method here 
     moveImage(ii); 
} 
+1

好的,謝謝你的詳細回覆。謝天謝地,我能夠通過只打一次超級電話並在不同地區移動我的水果來解決我遇到的問題?我不確定你是如何使用MouseMotionListener的?我已經能夠對水果/圖像進行動畫處理,因此它現在正在我的框架周圍飛舞。一旦我將鼠標懸停在框架上,如何使用MouseMotionListener將該水果移出框架?我在網上搜索了MouseMotion Listener,並有一個教程,但我仍然不確定。 – Martin

+0

@Martin這個問題可能會有所幫助:https://stackoverflow.com/questions/17867537/java-drawimage-how-do-i-undraw-or-delete-a-image – Blasanka

+0

是的,我不太清楚如何使用MouseMotionListener?想想你與我聯繫的是刪除圖像的事情。 – Martin