2014-10-07 41 views
0

我試圖顯示其他圖像上的幾個圖像。 對於我來說這兩張不同類別的照片非常重要,因爲我需要將此圖像與其他屬性相關聯。 我寫了一個一次添加並顯示一張圖片的類。這兩個圖像,一個在另一個在Java

import java.awt.*; 
import javax.swing.*; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 

public class Obrazek { 
    BufferedImage image; 
    Obrazek(){ 
    File imageFile = new File("tło.jpg"); 
     try { 
      image = ImageIO.read(imageFile); 
     } catch (IOException e) { 
      System.err.println("Blad odczytu obrazka"); 
      e.printStackTrace(); 
     } 
    } 
    JPanel pane = new JPanel() { 
      @Override 
      protected void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       g.drawImage(image, 0, 0, null); 
      } 
     }; 

} 

讓我說我有兩類,每一類都有不同的圖像。 然後,我用定義框架和創建圖像的主要方法編寫了我的主類。

import java.awt.*; 
import javax.swing.*; 


public class ButtonDemo{ 


     public static void main(String[] args) { 
      JFrame frame = buildFrame(); 
      Obrazek obraz = new Obrazek(); 


      frame.add(obraz.pane); 
     } 
     private static JFrame buildFrame() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.setSize(200, 200); 
     frame.setVisible(true); 
     return frame; 
    } 

} 

但是,當我添加下一個frame.add(someobject.pane);它刪除前一個,只顯示最後一個。如何讓它們一起展示,但是來自兩個不同的課程。

+0

的Blad odczytu obrazka =錯誤讀取圖像(拋光) – Leo 2014-10-07 20:15:28

+0

的確切方法取決於內容和目標。你是依靠透明度還是幾何來組成這兩個圖像?請澄清。 – trashgod 2014-10-07 21:12:16

+0

我在背景中有一些圖像,我想在這張圖片上生成一些圖片,但是這張圖片會隨機生成一些圖片,其中一些圖片會通過按鈕生成。 – Vekka 2014-10-07 22:05:17

回答

3

「我becous我需要這個圖像與其他屬性連接有兩種不同勢類此圖片是很重要的」

你可能會對此不正確,努力使每一個這些類別爲JPanel。我的意思是,從技術上講,你可以通過JLayeredPane來實現。但我會以不同的方式去做。您可以使用interface來組合要繪製的對象。只需在界面中定義draw方法即可。

public interface Drawable { 
    void draw(Graphics g); 
} 

然後你可以有一個主面板來做繪圖。該面板將包含對象的ListMap;一個List如果添加它們後訪問並不重要,並且Map如果您添加後需要輕鬆訪問它們。例如。

public class DrawingPanel extends JPanel { 
    List<Drawable> drawList; 
    // Map<String, Drawable> drawMap; 

    public void addToDrawList(Drawable drawable) { 
     drawList.add(drawable); 
     repaint(); 
    } 

    // public void addToDrawMap(String key, Drawable drawable) { 
    //  drawMap.put(key, drawable); 
    //  repaint(); 
    // } 

    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     for(Drawable drawable : drawList){ 
      drawable.draw(g); 
     } 

     // for (Drawable drawable : drawMap.values()) { 
     //  drawable.draw(g); 
     // } 
    } 
} 

現在你可以讓你想implements Drawable任何類,只是添加類的實例給drawListdrawMap。這樣一切都被繪製在同一個表面上。例如

class HelloDrawable implements Drawable { 
    @Override 
    public void draw(Graphics g) { 
     g.drawString("Hello", 100, 100); 
    } 
} 
class WorldDrawable implements Drawable { 
    @Override 
    public void draw(Graphics g) { 
     g.drawString("World", 150, 100); 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     DrawingPanel panel = new DrawingPanel(); 
     panel.addToDrawList(new HelloDrawable()); 
     panel.addToDrawList(new WorldDrawable()); 

     // panel.addToDrawMap("Hello", new HelloDrawable()); 
    } 
} 
+0

請參閱[相關](http://stackoverflow.com/a/26132743/2587435) – 2014-10-08 02:27:42

-1

在JavaFx中您可以使用StackPane和ImageView 將所有圖像放在ImageView中,並使用堆棧窗格將新圖像放在舊圖像上。

相關問題