3

ここで複数の質問で提案されているのを見たので、ペイントメソッドの代わりにペイントコンポーネントメソッドをオーバーライドして使用しようとしています。

私は多くの質問に目を通しましたが、まだこれを機能させることができないようです。画面のレンダリングに使用するオリジナルのコードを投稿しています。JFrame を拡張するのは正しい方法ではなく、代わりに JPanel を拡張し、そこからペイント コンポーネントを使用する必要があると考えています。JPanel を実際に拡張し、(レンダリング用に) JFrame を追加する別のオブジェクトがあります。

レンダリングに使用するオブジェクトは次のとおりです。ちなみに、これはペイント メソッドを完全にオーバーライドして動作します。

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 オブジェクトの update メソッドを呼び出します。

本当にコードが必要な場合は投稿できますが、うまくいけばこれで十分です。

4

2 に答える 2

10
  • ペイントしないでください

    1. paintComponent()に直接使用することによりJFrame
    2. に直接ペイントするJFrameのはお勧めできませJFrameん。このジョブには適切なコンテナではありません
    3. forの paint()代わりに使用する必要があります。paintComponent()JFrame
  • 親メソッド、ここではメソッドをオーバーライドする必要があると思わ@Overrideれるメソッドの前に追加します。このようにして、実際にあなたが思っていたものをオーバーライドしていない場合、コンパイラは警告します。paintComponent(...)

  • JComponent / JPanelに置くJFrame

  • override getPreferredSizefor JComponent / JPanel(your hardcoded // window size handle) 、それ以外の場合JComponent / JPanelはゼロ次元を返します。単純に画面には何も表示されません

于 2013-02-23T15:39:00.633 に答える