我一直在嘗試重寫並使用paint組件方法而不是paint方法,因爲我已經看到它在這裏的多個問題中被提出。paintComponent不工作(Java)
我已經看了很多問題,但我仍然無法得到這個工作。我發佈了用於呈現屏幕的原始代碼片段。我在想,擴展JFrame不是正確的方法,而是我需要擴展JPanel,並從那裏使用paint組件。我有另一個對象,我實際上擴展了JPanel,並添加了JFrame(用於渲染)。
下面是我用來渲染的對象,這個方法完全覆蓋了paint方法。
package render;
import java.util.Arrays;
import javax.swing.*;
import java.awt.*; //Graphics, Graphics2D, Image
import sprites.Picture;
public class Window extends JFrame{
private static final long serialVersionUID = 1L;
public static Picture[] image_list = new Picture[0]; // All the images I want to render
private static String win_title = "Window"; // The name of the window
private static CustomComponents cc = new CustomComponents();
public Window(){
setTitle(win_title); // set my title
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // close when you hit x button
setUndecorated(true); // window has nothing on it
}
// paints all the images in image list according to their priority
public void display(){
add(cc);
CustomComponents.updateImageList(image_list);
pack();
setMinimumSize(getSize());
setLocationRelativeTo(null); // puts the screen in the middle
setResizable(false); // can't resize the window
setVisible(true); // to see the window
}
public double[] getWinSize(){
double[] size = {this.getSize().getWidth(),this.getSize().getWidth()};
return size;
}
public static void endAll(){
for (Picture i:image_list){
i = null;
}
image_list = new Picture[0];
CustomComponents.updateImageList(image_list);
}
// close the window (seen in the game object)
public static void close(){
System.exit(0);
}
// called when adding a new sprite to the image_list array
public static void addPicture(Picture element){
Picture[] result = Arrays.copyOf(image_list, image_list.length +1); // does the same thing as the addObject method in objects
result[image_list.length] = element;
image_list = result;
Arrays.sort(image_list);
CustomComponents.updateImageList(image_list);
}
// updates the screen... Just repaints everything
public void update() {
cc.repaint();
}
}
class CustomComponents extends JComponent {
private static final long serialVersionUID = 1L;
private static Picture[] image_list;
public static void updateImageList(Picture[] image_list){
CustomComponents.image_list = image_list;
}
@Override
public Dimension getMinimumSize() {
return new Dimension(640,360);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(640,360);
}
@Override
public Dimension getMaximumSize() {
return new Dimension(640,360);
}
@Override
public void paintComponent(Graphics graphics) {
super.paintComponent(graphics);
Graphics2D g2d = (Graphics2D) graphics;
for (Picture i:image_list){
if (i.getVisibility()){
g2d.drawImage(i.getPic(), i.getXY()[0], i.getXY()[1], this);
}
}
Toolkit.getDefaultToolkit().sync(); // this is for linux machines
graphics.dispose(); // just good programming practice to collect the garbage
}
}
我會發布實際添加到窗口中的對象,但現在它太複雜了,只有少數事情發生。在構造函數中,我添加上面的JFrame窗口,然後使用計時器調用JFrame對象的更新方法。
如果你們真的需要我可以發佈的代碼,但希望這將足夠。
更改'公共無效paintComponent(圖形圖像) {'to'@Override public void paintComponent(Graphics graphics){'用於在編譯時輸出一些結果。每當重寫方法檢查簽名時使用它,並且該方法存在。 ;) – 2013-02-23 15:45:27
除了其他的建議 - 不要覆蓋update()!也不要調用你的自定義類窗口,這個名稱已經有一個AWT compoent,這會導致混淆。類應該有描述性名稱。 – camickr 2013-02-23 17:13:26
請勿使用graphics.dispose()。該評論與您創建Graphics對象時更相關。在這種情況下,Graphics對象被傳遞給組件,並被其他組件使用。 – camickr 2013-02-23 17:18:32