2015-12-03 57 views
2

我還沒有真正探索過這部分的Java。我可以創建一個班,說學生有他/她的所有詳細信息,如姓名,身份證和所有,但除此之外,我還可以存儲他們的照片,作爲數據成員?是否可以添加圖像(png)作爲Java類的屬性?

基本上,無論何時我創建一個Student對象,我都會傳入一張圖片作爲其參數之一?

所以,問題是,什麼是最標準和最好(在你看來)處理這種圖像對象的方式?

我對Java Swing類很熟悉,所以如果可以使用它,它將會非常棒。

回答

0

你可以有一個圖像或字節[]什麼代表學生的照片,但這是一個大型數據成員,你可能不需要每次參考學生。更好的做法可能是將存儲在數據庫或文件系統中的圖片作爲id引用,然後只在需要顯示圖片時根據需要加載圖片。

+1

爲什麼會是如果圖像存在,每次你引用的是學生的時候出了問題?這並不是說你實際上是在發送節目中的學生。你只是發送一個指向學生對象的指針。 – Emz

+0

假設你有一羣100k學生。現在,您已經爲垃圾回收器生成了一堆垃圾,您可能只需要5%的時間。 – digitaljoel

+0

我明白了。我喜歡這個提議。由於我有很多圖像,因此將它們存儲在數據庫中將是一條可行的路線。你能否詳細說明或者鏈接到解釋它的過程? –

2

爲便於使用,我建議您使用BufferedImage

有兩個選項,其中一個由HRgiger提供,您永遠不會存儲圖像,而不是每次加載它,另一個是直接將其存儲在Student實例中。

而不是將其存儲爲byte[] picture;,因爲您可能需要將來爲圖像提供一些功能。其中BufferedImage有,或者你可以很容易地添加到它。

正如你所說,你對Swing很滿意,它很容易處理。請注意,我不會讓學生渲染圖片本身。只需爲圖像提供一個getter並從相關方法中渲染即可。

一個簡短的例子。

Student.java

public class Student { 
    private String name; 
    private BufferedImage image; 

    public Student (String name) { 
     this.name = name; 
     this.image = ImageIO.read(new File(name + ".png")); 
    } 

    public getName() { 
     return name; 
    } 

    public getImage() { 
     return image; 
    } 
} 

一些paint方法的地方在那裏是有意義的油漆Student.image

private final List<Student> students = new ArrayList<>(); 

... 

@override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    for (Student s : students) { 
     g.drawImage (s.getImage(), x, y, null); 
    } 
} 

paintComponent需要有某種方式來訪問List<Student>。你當然也可以畫一個學生。

+0

您可以用一個例子來解釋一下,因爲我非常喜歡這個想法,並且曾經使用過BufferedImages。 –

+0

@BrendonMcCullum,現在寫一個快速的,不要猶豫,要求進一步的幫助。您可以使用[drawImage](https://docs.oracle.com/javase/tutorial/2d/images/drawimage.html)作爲了解自定義'paintComponent'以及如何在Swing中繪製圖像的參考。 – Emz

1

使用文件路徑String學生對象。這將是您最便宜的內存消費者之一。而當你需要調用一個實用程序方法類似的東西:

public static BufferedImage getStudentImage(Student student) throws IOException{ 
return ImageIO.read(new File(student.getImagePath())); 
} 
+0

如果你不必訪問我經常推薦這個圖片的圖片。在這裏,您可以輕鬆地構建過濾器以及我的答案中簡要提及的所有內容,但您不需要直接在'Student'類中存儲'BufferedImage'。但是,如果您經常閱讀圖片,我會推薦我的解決方案。 – Emz

相關問題